2016-08-29 4 views
0

Ich habe drei Einheiten und verwandte Klassen: BulkEmployee, BulkEmployeeRow und Abteilung BulkEmployeeRow enthält ein Objekt von BulkEmployee und Abteilung wie folgt aus:Hibernate: Haben beide verschmelzen und Update über Annotation

@ManyToOne 
BulkEmployee bulkEmployee; 
@ManyToOne(fetch = FetchType.EAGER) 
@Cascade(value = { CascadeType.SAVE_UPDATE }) 
Department department 

Jetzt gibt es eine Benutzeroberfläche, wo Mehrere Mitarbeiter können in großen Mengen erstellt werden. Diese Seite verfügt über die Funktion zum automatischen Speichern, sodass jede Änderung den Ruhezustand auslöst. SaveOrUpdate

Der Benutzer kann mehrere Mitarbeiterzeilen auf der Seite hinzufügen. Jede Mitarbeiterzeile hat eine Option zum Auswählen einer Abteilung aus einer vorhandenen Liste von Abteilungen oder ein Formular zum Erstellen einer neuen Abteilung.

Jetzt ist das Problem, dass wenn Benutzer dieselbe Abteilung für mehr als einen Mitarbeiter auswählt, gibt es folgende Ausnahme:

org.hibernate.NonUniqueObjectException: ein anderes Objekt mit dem gleichen Kennungswert wurde bereits mit der Sitzung verknüpft

Wenn ich CascadeType Abteilungs ändern wie unten zu fusionieren:

@ManyToOne(fetch = FetchType.EAGER) 
@Cascade(value = { CascadeType.MERGE }) 
Department department 

dann Auswahl der gleichen Abteilung für verschiedene Mitarbeiter funktioniert gut, aber eine neue Abteilung Auswahl gibt folgende Ausnahme:

org.hibernate.TransientObjectException: Objekt verweist auf ein nicht gespeicherte transientes Beispiel - die transiente Instanz speichern, bevor Spülung:

Gibt es eine Möglichkeit, ich kann Hibernate zu merge und dann nur über Anmerkungen speichern?

Antwort

0

Ok, so ist es nicht möglich, über Annotation zu tun, denke ich.

So wie überall vorgeschlagen, das habe ich

dao.merge(entity) 

und dann

dao.saveOrUpdate(entity) 

um das Problem zu lösen

Verwandte Themen