Java 关系为CascadeType.ALL JPA的IllegalStateException
我有主子实体关系,其中主实体是request,子实体是requestitem 我用以下方式定义了它们之间的关系Java 关系为CascadeType.ALL JPA的IllegalStateException,java,jpa,one-to-many,entitymanager,illegalstateexception,Java,Jpa,One To Many,Entitymanager,Illegalstateexception,我有主子实体关系,其中主实体是request,子实体是requestitem 我用以下方式定义了它们之间的关系 @OneToMany(mappedBy="iagrequest", cascade={CascadeType.ALL},fetch=FetchType.EAGER) private List<IagRequestItem> iagrequestitems; In my logic I am trying to update the existing entitie
@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();
@OneToMany(mappedBy=“iagrest”,cascade={CascadeType.ALL},fetch=FetchType.EAGER)
私人物品清单;
在我的逻辑中,我试图像这样更新现有的实体,
字符串ret=“”;
EntityTransaction=null;
IagRequest existingDB=this.findById(request.getAccuraquestid());
List updatedReqItems=new ArrayList();
List existingReqItems=new ArrayList();
试一试{
UpdatedRequestItems=request.getIagrequestitems();
existingReqItems=existingDB.getIagrequestitems();
trans=this.entityManager.getTransaction();
对于(int i=0;ijava.lang.IllegalStateException,带原因)
“当前没有活动的事务”
但是如果我像这样改变主子关系
然后,它不会抛出任何异常,不管数据库中没有更新任何内容
@OneToMany(mappedBy=“iagrequest”,fetch=FetchType.EAGER)
看起来我遗漏了什么或者我的基本原理不清楚
请提供指导
提前谢谢
我把代码也改成了下面的代码
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);
}
trans=this.entityManager.getTransaction();
trans.begin();
对于(inti=0;i我能够弄清楚这一点。
当我们有下面的映射时
@OneToMany(mappedBy=“iagrequest”,cascade={CascadeType.ALL},fetch=FetchType.EAGER)
我们必须首先从数据库中获取主行项目,然后遍历其现有行项目
然后,我们通过将新值从传入列表复制到现有行项目并将它们添加到新列表中来创建一个新列表
在那之后,我们简单地坚持主实体,它就像一个符咒
下面是代码
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();
updatedRequestItems=request.getIagrequestitems();
existingReqItems=existingDB.getIagrequestitems();
trans=this.entityManager.getTransaction();
trans.begin();
for(int i=0;iStop thinking only calls to persist()需要一个事务。在对Hibernate实体执行任何操作之前启动一个事务,并在完成所有操作之后提交。this.iagrequestitemDao.persist(updatedRequestItem);
->如何控制iagrequestitemDao中的事务?非常感谢您的回答。我更改了逻辑,如下所示:公共类JPAIAgreeQuestiteMDAO扩展了JpaDao实现iagrequestitemDao{public JPAIAgreeQuestiteMDAO(EntityManager)EntityManager){super(EntityManager);//TODO自动生成的构造函数存根}