JPA: Merge @OneToMany Duplicate entry error
Ich bin alwways immer folgende Fehlermeldung:
Internal Exception: com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Duplicate entry '2-1' for key 'PRIMARY'
Error Code: 1062
Call: INSERT INTO ENTITY_ENTITY (relationships_ID, Entity_ID) VALUES (?, ?)
bind => [1, 2]
Query: DataModifyQuery(sql="INSERT INTO ENTITY_ENTITY (relationships_ID, Entity_ID) VALUES (?, ?)")
Meine Klassen Aussehen:
@javax.persistence.Entity
public class Entity {
@Id
@GeneratedValue(strategy = GenerationType.TABLE)
protected Long id;
@Column(nullable=false, updatable=false)
protected String name;
@OneToMany(cascade=CascadeType.MERGE)
protected Collection<Entity> relationships = new ArrayList<Entity>();
}
Einer Instanz dieser Klasse verweisen können, andere Instanzen des gleichen Typs (selbst-Referenzierung).
Jetzt, während der Erstellung einer Instanz, die auf ein anderes, funktioniert alles einwandfrei.
Aber das problem ist, wenn solch ein (getrennt - ich bin mir nicht ganz sicher, da die Instanz bearbeitet über eine Facelets-form) - Instanz aktualisiert wird, D. H. den Namen, dann durch die Ausführung des EntityManager merge-Vorgang die Ausnahme - wie oben erwähnt - geworfen wird.
EDIT:
1. Erstellen Sie eine Instanz der Entität (z.B. E1).
2. Bestehen E1 über em.beibehalten werden(E1).
3. Später erstellen Sie eine weitere Instanz von Entity (E2), die refreneces E1 über die Eigenschaft Beziehungen.
4. Und bestehen E2: em.anhalten(E2).
--- Bis jetzt funktioniert alles einwandfrei.
- Laden zu durchsuchen, alle persistenten Entity-Instanzen und wählen Sie E2, das für die Bearbeitung (über ein Web-interface Passenden).
- Ändern d.h. der name der E2.
- Um die änderungen zu speichern: Rufen Sie em.merge(E2).
---Nun die Exception geworfen wird!
ENDE BEARBEITEN
Was ist falsch an meinem code?
Bitte, helfen Sie mir!!!
- Können Sie zeigen einige (pseudo -) code für die ganze Strömung und fixieren Sie die Zuordnung (oder die Titel)?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Scheint es die Art und Weise Sie trennen/Zusammenführen von Objekten ist irgendwie verdarb das Objekt zwei Referenzen auf das gleiche Element, oder zu denken, eine Referenz ist neu, wenn es war bestehende. Dies bewirkt das EINFÜGEN in die OneToMany-join-Tabelle, die eine doppelte und erhöht die constraint-Verletzung.
Versuchen debugging oder prüfen des Status der Auflistung auf jeder Stufe, ist es eine doppelte Instanz Hinzugefügt?
Eventuell könnte es etwas damit zu tun haben-caching oder der änderungsnachverfolgung. Sie könnten versuchen, das ausschalten der shared cache, oder aktualisieren Sie das Objekt, oder das deaktivieren der Weberei.
http://wiki.eclipse.org/EclipseLink/FAQ/How_to_disable_the_shared_cache%3F
http://wiki.eclipse.org/EclipseLink/Examples/JPA/Caching#How_to_refresh_the_cache
http://wiki.eclipse.org/Using_EclipseLink_JPA_Extensions_%28ELUG%29#How_to_Disable_Weaving_Using_EclipseLink_Persistence_Unit_Properties