JPA One2Many-Set erkennt seine Inhalte nicht wieder

KFlash

Mitglied
Hallo zusammen,

aktuell sitzen wir hier vor einem JPA Problem welches uns absolut hilflos zurück lässt:

Zuerst die Tools:
- Eclipse als IDE
- JPA 2.0 mit Hibernate als Provider
- Spring (falls das wichtig ist)

Situation:
Wir haben eine Baumstruktur persistiert. D.h. ein Knoten kann viele Kinder haben. Jeder Knoten aber nur 1 Elternknoten.

[1]Wir laden nun mittels READ den Elternknoten (ohne die Kindknoten mitzuladen).
[2]Danach laden wir einen Kindknoten dieses Elternknoten, ebenfalls mittels READ.

Anschließend testen wir:
Java:
elternknoten.getKinder().contains(kindKnoten);

Als Antwort erhalten wir "FALSE"!

Nun schauen wir uns die Objekte im Debugger an. Dort ist klar erkennbar, dass der Elternknoten eigentlich den Kindknoten sehr wohl enthält. Jedoch findet das Set (welches alle Kinder enthält) den Kindknoten nicht wieder.

Nun haben wir etwas anderes versucht:
[1]Wir laden nun mittels READ den Elternknoten (ohne die Kindknoten mitzuladen).
[2]Wir rufen nun "em.merge(elternknoten)" auf. Ja, der Knoten wurde gerade erst gelesen.
[3]Danach laden wir einen Kindknoten dieses Elternknoten, ebenfalls mittels READ.

Anschließend testen wir:
Java:
elternknoten.getKinder().contains(kindKnoten);

Als Antwort erhalten wir nun "TRUE"!

Was geht hier vor? Wieso findet das Set die Kinder nicht mehr bzw. wieso hilft merge?
 
N

nillehammer

Gast
equals()-Methode implementiert? Falls nicht, gibt contains nur true zurück, wenn die Objekte identisch sind.
 

KFlash

Mitglied
Das hatte ich vergessen zu erwähnen:

Wir haben für die Entities die equals und die hashCode() Methode überschrieben.

Dabei haben wir (wegen dem hier) bei hashCode alle die Properties einer Klasse einbezogen welche während der Nutzungszeit unverändert bleiben (und keine Assoziierten Objekte sind).
Bei Equals haben wir diese Felder + weitere Felder des Objektes einbezogen.

D.h. equals vergleicht mehr felder als hashCode für die hashCode berechnung einbezieht. Dadurch bleibt aber sichergestellt, dass für Objekte die equal sind der gleiche Hashcode erzeugt wird, aber die umkehrung gilt nicht zwingend (was legal ist).
 

Oben