Hibernate: Eine Entitätskopie wurde bereits einer anderen Entität zugewiesen

8

HiAll,

Ich versuche derzeit zu verstehen, was in meinem Codierungs- und Entitätsmodell falsch ist Ich benutze den Hibernate 4.2 für den CRUD-Betrieb mit nur generischen DAO-Mustern und annotierten Entitäten mit kaskadierenden ALL- und orphanRemoval = true. Ich habe die Entität DayPlan mit OneToMany-Beziehung zur DayPlanElement schwachen Entität. Das DayPlanElement wird in java.util.Set gespeichert. Jedes DayPlanElement hat eine Eigenschaft "order".

Der DayPlan hat auch eine OneToMany-Beziehung zu einer Entität Person . Die Entität Person wurde in java.util gespeichert. Liste .

Das DayPlanElement hat eine OneToMany-Beziehung zur DayPlanElementEntry schwachen Entität. java.util.Set zum Speichern verwendet. Die Entität Person ist auch eine OneToMany-Beziehung zur DayPlanElementEntry schwachen Entität. java.util.Set zum Speichern verwendet. Die Entitäten DayPlan , DayPlanElement und Person haben die ID, die von meiner Anwendung verwaltet wird, als String. Die DayPlanElementEntry schwache Entität hat eine zusammengesetzte ID: DayPlanElementEntryId, die mit EmbeddedId versehen ist und die parentPersonId und dayPlanElementId enthält. Es

Mit anderen Worten stellen Sie sich vor, dass eine Tabelle existiert, die den Tagesplan darstellt. Die Spalten sind die Stunden von 0 bis 24. Die Zeilen sind die Personen, die die Operationen aus dem Tagesplan ausführen müssen. Jede Spalte wäre eine DayPlanElement-Entität. Jede Zeile wäre eine Person entity. Und jede Zelle wäre DayPlanElementEntry entity.

Wenn ich nur neue Elemente (auch Personen) in die Tabelle einfüge und sie entferne (entferne sie auch aus der Liste und rufe dann DayPlanDAO.merge (dayPlan) auf - ich hoffe auf Kaskadierung und orphanRemoval) - ich habe kein Problem.

Nur wenn ich versuche, die angegebenen Personen neu zu ordnen (nur Vorgänge innerhalb von java.util.List zu entfernen) und den Aufruf DayPlanDAO.merge (dayPlan) - wird die folgende Ausnahme ausgelöst:

%Vor%

Ich debugge den EventCache, suche nach Problemlösungen, überprüfe einfach die implementierte equals () und hashCode () Methode - ohne Erfolg: - ((( Beachten Sie, ich verwende für die equals () Methode die Id. Zum Beispiel die zusammengesetzte ID von DayPlanElementEntry. Diese ID wird von hashCode () verwendet. Ich verstehe die Fehlermeldung einfach nicht, dreimal werden dieselben Eigenschaften ausgegeben - die IDs!

Ich habe Testklasse für den Ereigniscache, aber jetzt verstehe ich den folgenden Use-Case-Test nicht:

%Vor%

....

%Vor%

Wir haben die einfache Entity entity1 mit Id = 1 , dann behalten wir sie bei. Dann erstellen wir die einfache Entität copy1 und legen sie als Wert in den Event-Cache. Als Schlüssel dient die persistente Entity * 1 *. Dann erstellen wir eine einfache Entity * 2 * mit Id = 2 , behalten sie bei und erstellen dann die Entity copy * 2 * mit der ID 2 und lege es als Wert in den Ereigniscache. Als Schlüssel dient die persistente entity2 .  Warum eine solche Situation falsch ist und warum erwartet wird, dass IllegalStateException ausgelöst werden muss?

Danke für Ihre Hilfe!

    
Kamen Jahr 13.07.2013, 21:06
quelle

6 Antworten

10

Für Hibernate Version 4.3.4 und Umgebung gibt es eine Lösung. Fügen Sie einfach dieses Artefakt hinzu:

%Vor%

Dieser Fix ersetzt den MergeEventListener durch einen solchen, der diese Art der Zusammenführung behandelt.

    
Tires 26.03.2014 13:16
quelle
5

Ich habe das gleiche Problem mit meinem Code. Probieren Sie diese Lösung aus:

Es wird wahrscheinlich von zwei "cascade.all" verursacht. Wenn Sie mit einer DayPlan-Entität arbeiten, hat sie sowohl eine Liste als auch eine Liste und beide haben 1: M zu DayPlanElementEntry.

Zwei "cascade.all" könnten also feststellen, dass DayPlanElementEntry der Person zugewiesen wurde, wenn DayPlanElement versucht, darauf zuzugreifen, selbst wenn es sich um denselben DayPlanElementEntry handelt.

Ich hoffe, es hilft.

Am besten, Chong

    
Chong Yue 31.03.2014 18:45
quelle
5

Dies kann behoben werden, indem Sie auf Hibernate 4.2.15 / 4.3.6 oder höher aktualisieren und die folgenden Zeilen zu Ihrer persistence.xml hinzufügen:

<property name="hibernate.event.merge.entity_copy_observer" value="allow"/>

Weitere Informationen finden Sie Ссылка .

    
Suraj Menon 24.08.2015 18:55
quelle
1

Wenn dies im Zusammenhang mit einem Test steht, schlage ich vor, dass Sie Ihrer session.flush () mit einer session.clear () folgen. Dadurch wird effektiv der Sitzungscache gelöscht, der den Kern des Problems darstellt.

Mögliche Gründe für dieses Problem (kann ich mir vorstellen):

  • Dieselbe Entitätskopie wird dem Cache unter verschiedenen Entitätsschlüsseln hinzugefügt. Legen Sie unter der put-Methode in EventCache.java einen Haltepunkt fest, um weitere Details zu erhalten.
  • Ein neu eingeführter Fehler in der von Ihnen verwendeten Version von Hibernate.
Newbie 12.02.2014 06:34
quelle
0

Ist Ihre Beziehung zwischen Element und Komponente unidirektional oder bidirektional? Wenn es bidirektional ist, stellen Sie sicher, dass Sie keine Cascade.MERGE-Anrufe mehr auf Item haben.

Entfernen Sie CascadeType.Merge aus Ihrer Beziehung

    
becher henchiri 07.06.2016 09:47
quelle
0

In der jpa-Konfigurationsdatei unten wird das Problem gelöst.

In der Beziehung "Viele zu viele", wenn sich dieselbe Entität während der Durchführung einer Merger-Operation mit bereits existierenden Entitäten wiederholt, kann Hibernate nicht zwischen ihnen unterscheiden, bis wir ihm helfen, den Unterschied zu finden.

%Vor%     
Chaitanya 09.09.2017 18:46
quelle

Tags und Links