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.
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
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):
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
:
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.
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 .