Spring Boot : Update H2 Repository

Diskutiere Spring Boot : Update H2 Repository im Allgemeine Java-Themen Bereich.
T

tummigummi1984

Guten Morgen in die Runde :

Ich baue gerade eine kleine Spring Boot Anwendung und will meine Datenobjekte in einer Datenbank speichern, Dazu benutze ich H2 als Datenbank und es klappt auch ziemlich gut.

Nun meine Frage : Wenn sich ein Objekt ändert und ich es erneut in die Datenbank speichere existiert es 2x. Wie schaffe ich es, dass das Objekte geupdatet wird ?

Zu meiner Struktur :
Meine Repositories existieren als Interface :
Java:
public interface ImportedLocationRepository extends JpaRepository<ImportedLocation, Long> {
}
Das Speichern der Objekte erfolgt in einem speraten Repository Serive :
Java:
        if (modelObject instanceof ImportedLocation) {
            log.info("save location object '{}' to location respository", modelObject);
            locationRepository.save((ImportedLocation) modelObject);
        }
Kann mir jemand einen Tipp geben ?
Vielen Dank für eure Unterstützung
Euer Tummi
 
L

lam_tr

Ich vermute mal dein modelObject ist ein neues Object ohne Key, beim Speichern werden zwar die Daten in DB geinsertet und nicht geupdatet.

Wo holst du modelObject her?
 
T

tummigummi1984

Hallo und vielen Dank für deine sehr schnelle Antwort.

Also das ganze ist etwas umfangreicher :
Im ersten Schritt werden die Daten aus einer CSV Datei importiert. Dabei werden alle ModelObjekte (es gibt noch mehr als die ImportedLocation) angelegt und auch in der Datenbankgespeichert.

Bei einem erneuten Start der App werden die Daten wieder aus der Datenbank gelesen, nun haben alle vorhandenen Objekte auch eine ID(bzw Key). Aber wenn sich nun ein existierendes Objekt ändert so wird es in der Datenbank neu angelegt.
 
L

lam_tr

Also wenn du ein bestimmtes Objekt über
locationRepository.findById(1).setName("HelloWorld") machst, logt er dir ein Insert anstatt ein Update? Unwahrscheinlich.

Zeig doch mal was du gemacht hast.
 
T

tummigummi1984

Okay
ICh verwende nur save ohne zu Prüfen ob das Objekt bereits vorhanden ist. Wird das nicht "automatisch" gemacht.
Also wenn ich in mein locationRepository ein Objekt mit einer id speichern möchte meine ich ?
 
L

lam_tr

Nee es geht mir mehr oder weniger darum, ob du das Objekt schon davor in irgendeinerweise schon geholt hast.

Wenn du das Objekt einfach neu instanziiert hast und die Werte eines bereits existierenden übernimmt, speichert der als eine neue Row in der DB.

Daher die Frage, wo holst du modelObject her und hat das Objekt eine Id?
 
T

tummigummi1984

Wenn die App zum allersten mal gestartet wird existieren natürlich noch keine Objekte. DIeser werden durch einen Import angelegt und dann auch in der Datenbank gespeichert !
Bei jedem weiteren start werden zuerst die Objkete aus der Datenbank geholt und haben dann auch eine ID
 
L

lam_tr

Ja das ist richtig, und wenn du Updaten willst, wo holst du die Daten her?
 
T

tummigummi1984

Die Daten werden danach in einer Liste zwischengespeichert. MIt diesen Daten wrid dann gearbeitet (also änderungen gemacht)

Aber wenn ich das richtige verstehe, ist es sinnvoller bei einem save Aufruf zu prüfen ob das Objekt bereits in der DB vorhanden ist
 
L

lam_tr

An sich muss der das updaten wenn du die zwischengespeichert und wiederverwendest. Wie ist deine Entität definiert?
 
T

tummigummi1984

Java:
@NoArgsConstructor(access = AccessLevel.PRIVATE)
@RequiredArgsConstructor
@Entity
@EqualsAndHashCode
@ToString
@Slf4j
public class ImportedLocation implements ILocation {

    @Id
    @Getter
    @GeneratedValue(strategy = GenerationType.AUTO)
    @EqualsAndHashCode.Exclude
    private Long id;

    @Getter
    @NonNull
    private String postalCode;

    @Getter
    @NonNull
    private String city;

    @Getter
    @NonNull
    private String street;

    @Getter
    @NonNull
    private String houseNumber;
}
So sieht meine Klasse aus.
Trotzdem verstehe ich nicht, wie ein update ausführen soll. ALso wenn ich
 
L

lam_tr

Das passt soweit auch. Und an welcher stelle zwischenspeicherst du die Locations und dann wieder die Frage wie holst du das modelObject, kannst du mir da mehr Code zeigen?
 
mrBrown

mrBrown

BTW, bei Entitäten sollte nur die ID für equals benutzt werden, und nicht alles außer der ID.
 
T

tummigummi1984

Danke für den Einwand :

Vielleicht noch eine wichtige Information : meine app soll spieldaten verwalten.
Dazu ist es mir wichtig, dass die importierten Spiel und auch weitere Objekte (Wettbewerb) nur einmal vorkommen, daher muss ich beim Import bereits vergleichen ob das Objekt schon importiert worden ist und somit vorhanden ist. Daher vergleiche ich alle bzw fast alle properties
Gibt es evtl. einen besseren weg?
 
mrBrown

mrBrown

Das führt dazu, das zwei Entitäten auf Datenbankseite identisch sind, auf Applikationsseite aber nicht, und andersrum. Bringt erfahrungsgemäß nur Probleme mit sich.
Führt auch das Konzept von Änderungen ad absurdum: X ist vor einer Änderung ein anderes Objekt als nach einer Änderungen, aber genau das sollte ja nicht gelten. (Wenn sich dein Alter ändert, bist du ja auch nicht plötzlich eine andere Person, sondern hast nur ein anderes Alter)


Doppelte Einträge kannst du entweder auf Datenbankseite verhindern (unique-Constraints), oder vorm einfügen einfach abfragen, ob ein Eintrag mit diesen Werten vorliegt.


Für dein Problem solltest du aber wie gesagt mal den Code zeigen, wo Objekte erstellt, verändert und gespeichert werden.
 
Thema: 

Spring Boot : Update H2 Repository

Passende Stellenanzeigen aus deiner Region:
Anzeige

Neue Themen

Anzeige

Anzeige
Oben