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 :
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.
Also wenn du ein bestimmtes Objekt über
locationRepository.findById(1).setName("HelloWorld") machst, logt er dir ein Insert anstatt ein Update? Unwahrscheinlich.
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 ?
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
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?
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?
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.