0

I have master child entity relationship where master entity is request and child entity is requestitem

I have defined the relationship in them in following way

@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();      

It throws >java.lang.IllegalStateException with reason

"No transaction is currently active" However if I changed the master child relationship like this

Then it does not throw any exception ,howver nothing is updated in DB @OneToMany(mappedBy="iagrequest", fetch=FetchType.EAGER)

Looks like I am missing something or my fundamentals are not clear Please provide guidance Thanks in advance

I changed the code to following as well

 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);

     }

But I still get the same error

  • Stop thinking only calls to persist() needs a transaction. Start a transaction before doing anything with Hibernate entities, and commit at after you've done all you had to do with them. – JB Nizet Jun 30 '17 at 16:20
  • `this.iagrequestitemDao.persist(updatedReqItem);` -> how do you control transaction in iagrequestitemDao? – fg78nc Jun 30 '17 at 16:37
  • Thank you very much for your response. I changed the logic as follows now – user1670018 Jun 30 '17 at 16:38
  • public class JpaIagRequestItemDao extends JpaDao implements IagrequestitemDao{ public JpaIagRequestItemDao(EntityManager entityManager) { super(entityManager); // TODO Auto-generated constructor stub } } – user1670018 Jun 30 '17 at 16:42

1 Answers1

0

I was able to figure that out. When we have following mapping then @OneToMany(mappedBy="iagrequest", cascade={CascadeType.ALL},fetch=FetchType.EAGER)

We have to first get master line item from database and then loop through its existing line items Then we create anew list by copying new values from incoming list to the existing line items and adding them in new list

After that we simply persist the master entity and it works like a charm

Here is code for that

    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();