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.

InformationsquelleAutor Reem | 2013-11-28

Schreibe einen Kommentar