2017-06-30 4 views
0

Ich habe Master Kind Entitätsbeziehung wo Master Entität Anfrage und Kind Entität ist requestitemIllegal mit Beziehung CascadeType.ALL JPA

ich die Beziehung in folgender Weise

@OneToMany(mappedBy="iagrequest", cascade={CascadeType.ALL},fetch=FetchType.EAGER) 
    private List<IagRequestItem> iagrequestitems; 

In my logic I am trying to update the existing entities like this, 



    String ret = ""; 
    EntityTransaction trans = null; 
    IagRequest existingDB = this.findById(request.getAccRequestId()); 
    List <IagRequestItem> updatedReqItems = new ArrayList<IagRequestItem>(); 
    List <IagRequestItem> existingReqItems = new ArrayList<IagRequestItem>(); 
    try { 
     updatedReqItems = request.getIagrequestitems(); 
     existingReqItems = existingDB.getIagrequestitems(); 

     trans = this.entityManager.getTransaction(); 
     for(int i=0;i<updatedReqItems.size();i++) { 
      IagRequestItem updatedReqItem = updatedReqItems.get(i); 
      IagRequestItem existingReqItem = existingReqItems.get(i); 
      updatedReqItem.setAccRequestItemId(existingReqItem.getAccRequestItemId()); 
      updatedReqItem.setIagrequest(existingReqItem.getIagrequest()); 
      updatedReqItem.setRequestItemConnector(existingReqItem.getRequestItemConnector()); 
      updatedReqItem.setRequestItemName(existingReqItem.getRequestItemName()); 
      updatedReqItem.setRequestItemValidFrom(existingReqItem.getRequestItemValidFrom()); 
      updatedReqItem.setRequestItemValidTo(existingReqItem.getRequestItemValidTo()); 
      updatedReqItem.setRequestItemType(existingReqItem.getRequestItemType()); 
      updatedReqItem.setRequestItemVersion(existingReqItem.getRequestItemVersion()); 
      updatedReqItems.set(i, updatedReqItem); 
      existingDB.getIagrequestitems().set(i, updatedReqItem); 
      this.iagrequestitemDao.persist(updatedReqItem); 
      //this.iagrequestitemDao.persist(updatedReqItem); 

     } 
     trans.begin();   
     this.entityManager.persist(existingDB);      
     trans.commit();  

Es wirft> definiert haben java.lang.IllegalStateException mit Grunde

„Keine Transaktion ist derzeit aktiv“ Allerdings, wenn ich die Master-Kind-Beziehung wie diese

geändert

es spielt dann keine Ausnahme auslösen, howver nichts in DB aktualisiert @OneToMany (mappedBy = „iagrequest“, holen = FetchType.EAGER)

Sieht aus wie ich bin etwas fehlt oder meine Grundlagen sind nicht klar Bitte geben Hinweise Vielen Dank im Voraus

änderte ich den Code folgenden auch

trans = this.entityManager.getTransaction(); 
    trans.begin(); 
    for(int i=0;i<updatedReqItems.size();i++) { 
     IagRequestItem updatedReqItem = updatedReqItems.get(i); 
     IagRequestItem existingReqItem = existingReqItems.get(i); 
     updatedReqItem.setAccRequestItemId(existingReqItem.getAccRequestItemId()); 
     updatedReqItem.setIagrequest(existingReqItem.getIagrequest()); 
     updatedReqItem.setRequestItemConnector(existingReqItem.getRequestItemConnector()); 
     updatedReqItem.setRequestItemName(existingReqItem.getRequestItemName()); 
     updatedReqItem.setRequestItemValidFrom(existingReqItem.getRequestItemValidFrom()); 
     updatedReqItem.setRequestItemValidTo(existingReqItem.getRequestItemValidTo()); 
     updatedReqItem.setRequestItemType(existingReqItem.getRequestItemType()); 
     updatedReqItem.setRequestItemVersion(existingReqItem.getRequestItemVersion()); 
     updatedReqItems.set(i, updatedReqItem); 
     existingDB.removeIagrequestitem(existingReqItem); 
     existingDB.addIagrequestitem(updatedReqItem); 

     this.iagrequestitemDao.persist(updatedReqItem); 
     //this.iagrequestitemDao.persist(updatedReqItem); 

    } 

Aber ich immer noch die gleichen Fehler

+0

Hör auf zu denken, dass nur Aufrufe persistieren() eine Transaktion benötigen. Starten Sie eine Transaktion, bevor Sie irgendetwas mit Hibernate-Entitäten tun, und begehen Sie, nachdem Sie alles getan haben, was Sie damit zu tun hatten. –

+0

'this.iagrequestitemDao.persist (updatedReqItem);' -> Wie kontrollierst du die Transaktion in iagrequestitemDao? – fg78nc

+0

Vielen Dank für Ihre Antwort. Ich habe die Logik wie folgt nun – user1670018

Antwort

0

Ich konnte das herausfinden. Wenn wir folgende Mapping dann @OneToMany (mappedBy = "iagrequest" Kaskade = {} CascadeType.ALL, holen = FetchType.EAGER)

Wir haben zum ersten Master-Position aus der Datenbank erhalten und dann die Schleife durch seine bestehende Positionen Dann erstellen wir aufs neue Liste durch neue Werte von Eingangsliste Kopieren auf die bestehenden Positionen und das Hinzufügen von ihnen in neue Liste

Danach haben wir einfach die Master-Einheit bestehen bleiben und es wirkt wie ein Zauber

Hier ist Code dafür

updatedReqItems = request.getIagrequestitems(); 
     existingReqItems = existingDB.getIagrequestitems(); 
     trans = this.entityManager.getTransaction(); 
     trans.begin(); 
     for(int i=0;i<length;i++) { 
     IagRequestItem currentItem = updatedReqItems.get(i); 
     //DB Item 
     IagRequestItem dbItem = existingDB.getIagrequestitems().get(i); 
     dbItem.setRequestItemAction(currentItem.getRequestItemAction()); 
     newReqItems.add(dbItem); 
    } 


    existingDB.setIagrequestitems(newReqItems); 
    this.entityManager.persist(existingDB); 
    trans.commit(); 
Verwandte Themen