javax.persistence.EntityNotFoundException:无法找到ID为X的对象

时间:2015-03-04 19:18:40

标签: java jpa

我正在尝试保留一个对象,之后我想向该对象添加2个列表然后更新它(因为我无法使用列表保留该对象)。

所有beign在一个循环中完成,第一次迭代工作正常,从第二次我得到一个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);
}

如果我删除列表和更新,它可以正常工作。

对象:

@Entity
public class Foo {

  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  @Basic(optional = false)
  private Integer id;

  @Basic(optional = false)
  @NotNull
  private String var;

  @OneToMany(cascade = CascadeType.ALL)
  private List<Bar> barList;

  @OneToMany(cascade = CascadeType.ALL)
  private List<Cat> catList;

  //Getters and Setters
}

DAO方法:

public void save(Foo foo) {
  this.manager.joinTransaction();
  this.manager.persist(foo);
  //this.manager.flush(); Tried this, but didn't work
}

public void update(Foo foo) {
  this.manager.joinTransaction();
  this.manager.merge(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:使用这种通用的方法来简化,如果需要我会发布我的解决方案(或我称之为解决方案的混乱)

4 个答案:

答案 0 :(得分:1)

因为您要反复添加相同的列表。因为您有OneToMany,所以第二个事务表示您已经保留了该列表。

解决方法是改变与ManyToMany的关系

答案 1 :(得分:0)

我认为问题在于事务获取事务并在dAO中的save方法中提交。

this.manager.getTransaction().commit();

如果出现错误,那是因为没有活动事务,这就是刷新失败的原因。确保您在一个事务中,考虑使用EntityTransaction开始,提交和结束围绕DAO方法的事务。

如果您没有活动的TX,您将无法将实体写入数据库,当您尝试合并某些实体时,将无法找到该实体,这就是您获得的内容的原因{ {1}}

---更新

进行合并时,Foo对象的ID是多少?我认为不是正确的,或者至少是数据库中插入的最后一个id,所以我建议首先找到然后合并。

使用

EntityNotFoundException

使用id,并验证实例是否具有正确的密钥

答案 2 :(得分:0)

通过@ManyToOne或@OneToOne添加@NotFound(action = NotFoundAction.IGNORE)很有帮助,因为..ToOne默认为FetchType.EAGER

答案 3 :(得分:0)

我遇到了类似的问题。通过将 @ManyToOne 注释更新为:

来修复
    @NotNull
    @JoinColumn(nullable = false)
    @ManyToOne(optional = false, fetch = FetchType.LAZY)
    private ParentEntityClass parent;

添加:nullable = falseoptional = false, fetch = FetchType.LAZY 并且,除了这些 - @NotNull (javax.validation.constraints.NotNull - 可能没有必要,只是为了防止空值 :) )