2016-06-04 6 views
0

Vielen Dank im Voraus für Ihre Hilfe.JPA losgelöstes Objekt und Primärschlüssel

Ich habe ein losgelöstes Objekt mit untergeordneten Objekten. Ich muss die untergeordneten Objekte in der Reihenfolge einfügen oder löschen. Also ändere ich die Primärschlüsselwerte des Kindes. Dann entferne ich jedes Kind aus der Datenbank. Dann erstellen Sie alle untergeordneten Objekte, sondern Eclipse über den Primärschlüssel beschwert sich bereits existieren nicht Datenbank aktualisieren können Hier ist mein Code

Quotation q = ejbFacade.find(selected.getQuotationPK()); 
    for (QTitle qt : q.getQTitleList()) { 
     for (QActivity qa : qt.getQActivityList()) { 
      for (QCategorywork qc : qa.getQCategoryworkList()) { 
       for (QManual qm : qc.getQManualList()) { 
        qmFacade.remove(qm); 
       } 
       for (QProduct qp : qc.getQProductList()) { 
        qpFacade.remove(qp); 
       } 
       qcFacade.remove(qc); 
      } 
      qaFacade.remove(qa); 
     } 
     qtFacade.remove(qt); 
    } 
    for (QTitle qt : selected.getQTitleList()) { 
     qtFacade.create(qt); 
     for (QActivity qa : qt.getQActivityList()) { 
      qaFacade.create(qa); 
      for (QCategorywork qc : qa.getQCategoryworkList()) { 
       qcFacade.create(qc); 
       for (QManual qm : qc.getQManualList()) { 
        qmFacade.create(qm); 
       } 
       for (QProduct qp : qc.getQProductList()) { 
        qpFacade.create(qp); 
       } 
      } 
     } 
    } 
    ejbFacade.merge(selected); 
    ejbFacade.refresh(selected); 

Das ausgewählte Objekt ist freistehend und alle Kinder hat cascadetype.all gesetzt. Vielleicht gibt es eine andere effiziente Möglichkeit, das oben genannte zu tun. Irgendein Rat!!

+0

Bitte zeigen Sie, was Sie meinen, wenn Sie sagen, dass Sie den Primärschlüsselwert des Kindes ändern. Was ist die genaue Ausnahme und Stapel? Wie die folgende Antwort zeigt, erlaubt JPA keine Änderung von Primärschlüsseln, daher sollten diese Operationen in ihren eigenen Transaktionen vollständig isoliert sein - nur weil Sie denken, dass sie eine neue Entität einfügen, heißt das nicht, dass sie Referenzen verwaltet oder sie zwischenspeichert zu. Sie könnten versuchen, Ihre geänderte getQTitleList-Liste zu dem eingelesenen Angebot hinzuzufügen, da die Änderungsverfolgung möglicherweise keine Änderungen an Fremdschlüsseln berücksichtigt. – Chris

Antwort

0

Sie sagen:

ich jedes Kind aus der Datenbank zu entfernen.

und Sie sagen auch:

Dann erstellen Sie alle das Kind

Bitte versuchen Sie es Objekte, diese beiden Vorgänge in ihrer eigenen Transaktionsgrenze auszuführen. Sie werden sehen, sicherlich die

über den Primärschlüssel beschweren existieren bereits

gegangen ist.

+0

Die Childs werden in der Datenbank korrekt neu erstellt. Das Problem tritt auf, wenn ich versuche, das übergeordnete Objekt zu bearbeiten –