Ich habe im Wesentlichen einige Objekte in dieser Konfiguration (das reale Datenmodell ist etwas komplexer):
- A hat eine Viele-zu-Viele-Beziehung zu B. (B hat
inverse="true"
) - B hat eine Eins-zu-Eins-Beziehung zu C. (Ich habe
cascade
eingestellt auf"save-update"
) - C ist eine Art Typ- / Kategorietabelle.
Außerdem sollte ich wahrscheinlich erwähnen, dass die Primärschlüssel beim Speichern von der Datenbank generiert werden.
Bei meinen Daten treten manchmal Probleme auf, bei denen A eine Reihe verschiedener B-Objekte hat und diese B-Objekte auf dasselbe C-Objekt verweisen.
Wenn ich anrufe session.saveOrUpdate(myAObject)
, wird eine Fehlermeldung im Ruhezustand angezeigt, die besagt : "a different object with the same identifier value was already associated with the session: C"
. Ich weiß, dass der Ruhezustand nicht dasselbe Objekt zweimal in derselben Sitzung einfügen / aktualisieren / löschen kann, aber gibt es einen Weg, dies zu umgehen? Dies scheint nicht so ungewöhnlich zu sein.
Während meiner Untersuchung dieses Problems habe ich Leute gesehen, die die Verwendung von vorgeschlagen haben session.merge()
, aber wenn ich das tue, werden alle "widersprüchlichen" Objekte als leere Objekte in die Datenbank eingefügt, wobei alle Werte auf null gesetzt sind. Das wollen wir natürlich nicht.
[Bearbeiten] Eine andere Sache, die ich vergessen habe zu erwähnen, ist, dass (aus architektonischen Gründen, die außerhalb meiner Kontrolle liegen) jedes Lesen oder Schreiben in einer separaten Sitzung erfolgen muss.