javax.persistence.EntityNotFoundException:找不到id为X的对象
我试图持久化一个对象,之后我想向该对象添加两个列表,然后更新它(因为我不能用列表持久化对象) 所有这些都是在一个循环中完成的,第一次迭代运行得很好,从第二次开始,我得到了一个javax.persistence.EntityNotFoundException:找不到id为X的对象,java,jpa,Java,Jpa,我试图持久化一个对象,之后我想向该对象添加两个列表,然后更新它(因为我不能用列表持久化对象) 所有这些都是在一个循环中完成的,第一次迭代运行得很好,从第二次开始,我得到了一个EntityNotFoundException,表示找不到进行更新的ID private Foo foo; private FooDao dao; for(int i = 0 ; i<10 ; i++){ foo = new Foo(); foo.setVar(i); dao.save(foo);
EntityNotFoundException
,表示找不到进行更新的ID
private Foo foo;
private FooDao dao;
for(int i = 0 ; i<10 ; i++){
foo = new Foo();
foo.setVar(i);
dao.save(foo);
generateLists(); //creates a new list every interaction
foo.setCatList(catList);
foo.setBarList(barList);
dao.update(foo);
}
错误:
ERROR [org.jboss.as.ejb3] (EJB default - 1) javax.ejb.EJBTransactionRolledbackException: Unable to find foo with id 4
ERROR [org.jboss.as.ejb3.invocation] (EJB default - 1) JBAS014134: EJB Invocation failed on component FooDao for method public void FooDao.atualiza(Foo): javax.ejb.EJBTransactionRolledbackException: Unable to find Foo with id 4
ps:使用这种通用方法来简化,如果需要,我将发布我的解决方案(或我称之为解决方案的混乱),因为您一次又一次地添加相同的列表。由于您有一个任务,第二个事务表示您已经保留了该列表
一种解决方法是更改与ManyToMany的关系,我认为问题在于事务在dAO的save方法中获取事务并提交
this.manager.getTransaction().commit();
如果出现错误,这是因为没有活动事务,这就是刷新失败的原因。确保你在一个事务中,考虑使用<代码> EntyType 开始,提交并结束DAO方法周围的事务。< /P>
如果您没有活动的TX,则无法将实体写入数据库,并且当您尝试合并某个实体时,将找不到该实体,这就是您得到的原因EntityNotFoundException
---更新
进行合并时,Foo对象的ID是什么?我认为这不是正确的id,或者至少是数据库中插入的最后一个id,所以我建议先查找,然后合并
使用
T find(java.lang.Class entityClass,
java.lang.Object主密钥)
使用id,并验证实例是否具有正确的键,将@NotFound(action=NotFoundAction.IGNORE)与@ManyToOne或@OneToOne一起添加是有帮助的,因为..ToOne是FetchType.EAGER默认情况下,我遇到了类似的问题。通过将
@ManyToOne
注释更新为以下内容进行修复:
@NotNull
@JoinColumn(nullable = false)
@ManyToOne(optional = false, fetch = FetchType.LAZY)
private ParentEntityClass parent;
添加:
nullable=false
,optional=false,fetch=FetchType.LAZY
,除此之外,还有-@NotNull
(javax.validation.constraints.NotNull-可能不需要,只是为了防止出现null-ables:)对不起,我忘了添加列表更改,我得到的错误是,当他试图更新时,说没有找到保存时保存的ID。@bacoco你确定你第二次生成的列表没有相同的Bar或Cat对象吗?@singhaskash是的,列表是新的,具有不同的值,这些列表还没有保存,然后我尝试使用级联的foo更新来持久化。是的,只有在第二次迭代中更新失败。我得到一个javax.persistence.EntityNotFoundException:找不到id为XI的对象对不起,你是说join事务?我没有完全理解hibernate和JPA与事务(JTA)一起工作,它定义了当触摸数据时,需要将某些内容刷新到数据库中。在写入操作中写入某些内容之前,需要有一个活动的事务,请阅读此处的更多信息检查此示例,在hibernate将某些内容写入数据库之前,您必须开始发送,如果您不这样做,您将永远不会在数据库中保存某些内容,因此您正在查找的id将永远不存在。我可能没有正确表达自己的意思,刷新没有失败或生成错误,我尝试了em.flush(),但它没有更改结果。对于事务,它由容器管理,因此不需要在事务开始时进行管理。如果我尝试使用.getTransaction,我会得到一个java.lang.IllegalStateException:JTA EntityManager无法使用getTransaction(),因为JTA正在管理事务。为了确认事务是否正常,如果我删除更新和child,一切都会正常,所有的foo都会持久化,但它们没有关联的cat和bar。
this.manager.getTransaction().commit();
<T> T find(java.lang.Class<T> entityClass,
java.lang.Object primaryKey)
@NotNull
@JoinColumn(nullable = false)
@ManyToOne(optional = false, fetch = FetchType.LAZY)
private ParentEntityClass parent;