Hibernate Insert zu einer Sammlung führt zu einem Löschen, dann werden alle Elemente in der Auflistung erneut eingefügt

8

Ich habe eine vielfache Beziehung zwischen CohortGroup und Mitarbeiter. Jedes Mal, wenn ich einen Mitarbeiter in die CohortGroup-Gruppe einfüge, löscht der Hibernate die Gruppe aus der Auflösungstabelle und fügt alle Mitglieder sowie die neue Gruppe erneut ein. Warum nicht einfach das neue hinzufügen?

Die Anmerkung in der Gruppe:

%Vor%

Die andere Seite im Mitarbeiter

%Vor%

Code-Snipit

%Vor%

unten ist die im Protokoll gemeldete SQL

%Vor%

Dies scheint sehr ineffizient zu sein und verursacht einige Probleme. Wenn mehrere Anfragen zum Hinzufügen eines Mitarbeiters zu der Gruppe gemacht werden, werden einige überschrieben.

Nähte wie equals und hashCode könnten dafür ein Grund sein. Im Folgenden finden Sie die Implementierung für diese Methoden. Irgendwelche roten Fahnen?

Kohortengruppe

%Vor%

Mitarbeiter

%Vor%

Ich habe der CohortGroup eine addMember-Methode hinzugefügt, die zu beiden Seiten der Beziehung hinzugefügt wird:

%Vor%

Weiter Dank an alle, die helfen.

    
Mark 15.04.2010, 21:35
quelle

5 Antworten

0

Ich habe Einsätze, so wie ich sie jetzt erwarte. Dank Pascal und z5h habe ich viel gelernt. Ich glaube, ich habe den HashCode und Equals korrekt implementiert. Das hat das Problem für mich nie gelöst. Stattdessen habe ich eine Intermediate Entity implementiert.

Was es im Folgenden wert ist, ist das Mapping in meinen Klassen Employee, CohortGroup und jetzt CohortGroupMeember.

Mitarbeiter:

%Vor%

CohortGroupMember

%Vor%

Kohortengruppe

%Vor%

Das Buch, das ich dafür befolgt habe, ist Java Persistence with Hibernate Kapitel 7.2.3

    
Mark 20.04.2010, 13:13
quelle
7

Ich vermute sehr, dass Sie equals und hashCode nicht korrekt überschreiben. Wenn Sie sie falsch überschreiben, kann dies zu einem Verhalten führen (da der Hash-Schlüssel in Karten als Schlüssel verwendet wird). Überprüfen Sie, was Sie mit equals und hashCode getan haben.

Verwenden Sie Ihre annotierten Entitäten mit gutem equals und hashCode , diesen Code (logisch äquivalent):

%Vor%

erzeugt die folgende Ausgabe auf meinem Computer:

%Vor%

Kein Löschen vor dem Einfügen!

Beachten Sie übrigens, dass Sie den Link auf beiden Seiten setzen sollten, wenn Sie mit bidirektionalen Verknüpfungen arbeiten, wie ich es in der Gruppe und am Mitarbeiter getan habe.

Oder fügen Sie Methoden zur defensiven Link-Verwaltung für Ihre Klassen hinzu, z. B. für CohortGroup :

%Vor%     
Pascal Thivent 16.04.2010 06:15
quelle
5

Ich hatte das gleiche Problem und fand mit etwas Versuch und Irrtum, dass die Löschungen nicht auftraten, wenn ich ein Set anstelle einer Liste als meine Sammlung verwendete. Irritierend, da ich JSF verwende und die UI-Komponenten nur über Listen iterieren. Aber da ist es.

    
Marc 23.08.2011 20:08
quelle
1

Wie andere vorgeschlagen haben, ist es wahrscheinlich ein Problem mit hashcode oder equals .

Speziell: Hibernate-Proxies verursachen Probleme mit instaceof , die Sie in Ihrer equals -Methode verwenden. Das buchstabiert schlechte Nachrichten.

Sieh dir das an: Ссылка

    
z5h 19.04.2010 13:42
quelle
0

Sie müssen hashCode() und equals() für Ihre Entitäten CohortGroup und Employee definieren. Dies kann automatisch von Ihrer IDE durchgeführt werden und entweder auf dem Primärschlüssel (manchmal keine gute Idee) oder auf einem Geschäftsschlüssel (bevorzugt) erfolgen.

Lesen Sie diesen Artikel .

    
Bozho 16.04.2010 05:49
quelle

Tags und Links