edit: arghhh ... war ein Fehler bei der Konfiguration der Transaktionen im Spring Framework.
Jetzt, da alles in einer Transaktion abläuft, klappt auch Session.merge() super !
Merke: immer nur ein Framework gleichzeitig lernen :)
Danke euch trotzdem fürs lesen !
Gruß, Gary
-----------------------------------------------------------------------------
Hallo !
Ich bin gerade dabei eine ganz einfache Anwendung auf Hibernate umzustellen um Hibernate zu lernen.
Soweit klappt das auch ganz gut - allerdings habe ich derzeit ein nur mit sehr hohem Aufwand zu beseitigendes Problem, welches ich so nicht einsehen kann :)
Folgende Objekt-Struktur liegt vor:
PARENT
CHILD
SUBCHILD
Jetzt möchte ich gerne NEUE Werte (die kommen von einer SOAP-Response) in die Datenbank schreiben und erstelle mit hierzu meinen Objekt-Baum aus der Response.
Ich gehe jetzt einfach mal davon aus, dass ALLE Werte neu sind und nicht erst gegen die Datenbank gecheckt werden müssen.
Das sieht dann irgendwie so aus. Die Nummer hinter dem _ ist der eindeutige Schlüssel des jeweiligen Objekts.
SESSION_OPEN
PARENT_1
CHILD_1
SUBCHILD_1
CHILD_2
SUBCHILD_2
CHILD_3
SUBCHILD_1
SAVE_ALLE_OBOVE
SESSION_CLOSE
Jetzt das eigentlich Problem: die 2. Erzeugung von SUBCHILD_1 ... das wirft mir beim speichern immer eine NonUniqueObjectException.
Den Grund dafür verstehe ich und kann den auch nachvollziehen. Allerdings habe ich einfach keine Ahnung, wie ich das vermeiden soll.
Mit Session.get() kann ich nicht nachschauen, ob es den Wert schon einmal gibt - er ist neu und noch nicht in der Datenbank enthalten.
Session.merge() findet es auch garnicht witzig einen Wert mergen zu wollen der noch nicht persistent ist.
Session.saveOrUpdate() / .save() wirft eh eine Exception.
Session.contains() prüft auf die gleiche Instanz, nicht auf den gleichen PK ... auch nicht brauchbar :(
Um diesen Fehler zu vermeiden könnte ich mir jetzt eine HashTable aufbauen in der ich anhand des Schlüssels SUBCHILD_1 finden würde und keine neue Instanz
erstellen würde ...
... aber die NonUniqueObjectException zeigt mir, dass Hibernate das ja schon macht :)
Nur wie komme ich da dran ?
Jedes einzelne Objekt direkt zu speichern und/oder gegen die Datenbank zu checken finde ich zu 'unperformant'.
Evtl. kann mir ja einer von euch auf die Sprünge helfen ?
1000 Dank !
Gruß,
Gary
|