Nicht Löschen übergeordnete Zeile mit JPA @OneToMany Beziehung
In meiner Java EE Anwendung, ich habe zwei persistente Entitäten Worklist
und Task
mit diesen JPA-Beziehungen:
Worklist
Person:
public class WorkList implements Serializable {
...
@OneToMany(cascade={CascadeType.PERSIST, CascadeType.REMOVE} , mappedBy ="worklist")
private List<Task> tasks;
...
}
Und die Task
Person:
public class Task implements Serializable {
...
@ManyToOne
private WorkList worklist;
...
}
Ich deutete auf den cascade-type-in Worklist
:
cascade={CascadeType.PERSIST, CascadeType.REMOVE}
So, ich kann weiterhin ein Worklist
und eine Liste der tasks
verbunden sind, um diese Worklist
aber ich habe ein problem wenn ich versuche zu löschen Worklist
und ich haben diese Ausnahme:
Avertissement: Local Exception Stack:
Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.3.2.v20111125-r10461):
org.eclipse.persistence.exceptions.DatabaseException
Internal Exception:
com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Cannot
delete or update a parent row: a foreign key constraint fails (`scopedata`.`TASKS`,
CONSTRAINT `FK_TASKS_WORKLIST_id` FOREIGN KEY (`WORKLIST_id`) REFERENCES `WORKLISTS`
(`id`))
Error Code: 1451
Call: DELETE FROM WORKLISTS WHERE ((id = ?) AND (version = ?))
bind => [2 parameters bound]
Query: DeleteObjectQuery(WokList{id=bbf05bdb-1314-4b07-9f4e-69898b800c00, creation=Thu
Nov 28 08:39:21 CET 2013, startDate=Thu Nov 07 00:00:00 CET 2013, endDate=Fri Nov 15
00:00:00 CET
Auf der anderen Seite kann ich erfolgreich löschen Task
.
Dies ist die methode in der WorklistManager.java entfernt einen Arbeitsvorrat
@Override
public boolean deleteWorkList(WorkList workList) {
if (findWorkList(workList)) {
em.remove(em.merge(workList));
return true;
}
return false;
}
Dann rufe ich diese methode in der Managed Bean:
public String deleteWorkList() {
workListManagerLocal.deleteWorkList(selectedWorkList);
return "index";
}
Arbeite ich mit: JPA2
und Glassfish 3.1.2.2
.
Gehen Sie bitte über diesen thread: stackoverflow.com/questions/306144/... Es scheint mir, dass das Verhalten der Waise zu entfernen ist eine sehr spezifische Umsetzung. Aber seht selbst!
Protokoll der SQL-Abfragen gemacht EclipseLink und posten Sie Ihre Frage. Es scheint, dass die Reihenfolge der SQL-Abfragen falsch ist.
Jetzt funktioniert es aber nur für die erste Zeit nach der Ausführung des Projekts, das zweite mal die gleiche Ausnahme angezeigt. In der Tat, ich habe zwei datatables. Das erste zeigt alle Arbeitsvorräte kann der Benutzer wählen Sie ein, um zu zeigen, das Liste der zugehörige Aufgaben (der zweite datatable). So, ich injizierte Arbeitsvorrat Managed Bean in Aufgabe Managed Bean zu erholen, die Id des selectedWorklist.
Wenn Sie gehen, um entfernen Sie den Arbeitsvorrat, was ist in der worklist-Aufgaben-Sammlung? Meine Wette ist, dass Sie nicht die Aufrechterhaltung der beide Seiten Ihre bidirektionale Beziehung, so dass Aufgaben, die Referenz Arbeitsvorrat aber diese Arbeitsvorräte nicht den task-Referenzen. Wenn dies der Fall ist, die Kaskade zu entfernen wird nicht funktionieren, da der PPV hat keine Möglichkeit zu wissen, über die anderen Aufgaben, die es braucht, um aufzuräumen. JPA nicht durchführen, Beziehung Instandhaltung - es ist Aufgabe der Anwendung ist, dass beide Seiten von bidirektionalen Beziehungen in Synchronisation miteinander.
Protokoll der SQL-Abfragen gemacht EclipseLink und posten Sie Ihre Frage. Es scheint, dass die Reihenfolge der SQL-Abfragen falsch ist.
Jetzt funktioniert es aber nur für die erste Zeit nach der Ausführung des Projekts, das zweite mal die gleiche Ausnahme angezeigt. In der Tat, ich habe zwei datatables. Das erste zeigt alle Arbeitsvorräte kann der Benutzer wählen Sie ein, um zu zeigen, das Liste der zugehörige Aufgaben (der zweite datatable). So, ich injizierte Arbeitsvorrat Managed Bean in Aufgabe Managed Bean zu erholen, die Id des selectedWorklist.
Wenn Sie gehen, um entfernen Sie den Arbeitsvorrat, was ist in der worklist-Aufgaben-Sammlung? Meine Wette ist, dass Sie nicht die Aufrechterhaltung der beide Seiten Ihre bidirektionale Beziehung, so dass Aufgaben, die Referenz Arbeitsvorrat aber diese Arbeitsvorräte nicht den task-Referenzen. Wenn dies der Fall ist, die Kaskade zu entfernen wird nicht funktionieren, da der PPV hat keine Möglichkeit zu wissen, über die anderen Aufgaben, die es braucht, um aufzuräumen. JPA nicht durchführen, Beziehung Instandhaltung - es ist Aufgabe der Anwendung ist, dass beide Seiten von bidirektionalen Beziehungen in Synchronisation miteinander.
InformationsquelleAutor Reem | 2013-11-28
Du musst angemeldet sein, um einen Kommentar abzugeben.
orphanRemoval=true
Eigenschaft, um Ihre@OneToMany
Beziehung.em.merge()
in Ihrempublic boolean deleteWorkList(WorkList workList)
einemanagedWorklist = em.find(Worklist.class, workList.getId())
und als das löschen der zurückgegebenen Arbeitsvorrat:em.remove(managedWorklist)
Sie müssen NICHT ANRUFENfindWorkList()
als Sie bereits tun, dass in Ihrem code.InformationsquelleAutor Andrei I