Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/395.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
javax.persistence.EntityNotFoundException:找不到id为X的对象_Java_Jpa - Fatal编程技术网

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;