java - 从 OneToMany 集合中删除时出现 EntityNotFoundException

标签 java hibernate jpa

我有两个通过双向 OneToMany/ManyToOne 关系连接的实体。

@Entity
class One {
  @OneToMany(mappedBy = "one", orphanRemoval = true, fetch = FetchType.EAGER)
  private Set<Many> manies;

  // ...
}

@Entity
class Many {
  @ManyToOne
  @JoinColumn(name = "one_id", nullable = false)
  private One one;

  // ...
}

当我想要删除 Many 实例时,我将其从其 Onemanies Set 中删除并将其从数据库中删除。如果我采用相同的 One 实例并再次保存它(因为我更改了任何内容,它不一定与关系相关),我会得到一个异常:

javax.persistence.EntityNotFoundException: Unable to find test.Many with id 12345

ID(在此示例中为 12345)是刚刚删除的实体的 ID。请注意,实体 12345 的删除已成功:事务提交成功,并且该行已从数据库中删除。

添加和删除实例是通过 Spring Data 存储库完成的。删除看起来或多或少像这样:

one.getManies().remove(manyToRemove);
oneDao.save(one);
manyDao.delete(manyToRemove);

我调试了一下,发现Set是一个Hibernate PersistentSet,其中包含一个字段storedSnapshot。这又是另一个仍引用已删除实体的Set。我不知道为什么这个引用没有从快照中删除,但我怀疑这就是问题所在:我认为 Hibernate 尝试再次删除该实体,因为它位于快照中,但不在实际集合中。我搜索了很长一段时间,但没有遇到其他人有类似的问题。

我使用 Hibernate 4.2.2 和 Spring Data 1.6.0。

我做的事情本质上是错误的吗?我该如何解决这个问题?

最佳答案

我也遇到同样的问题

解决方法是替换整个集合。

Set<Many> maniesBkp = one.getManies(); // Instance of PersistentSet
maniesBkp.remove(manyToRemove);

Set<Many> manies = new HashSet<Many>();
manies.addAll(maniesBkp);

one.setManies(manies);

...
manyDao.delete(manyToRemove);
...
oneDao.save(one);

关于java - 从 OneToMany 集合中删除时出现 EntityNotFoundException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25286999/

相关文章:

java - 如何监视引导上下文 bean

java - 选择动态层次结构的 jpa 自引用中的所有子子详细信息

java - hibernate-redis 是否支持由不同的 hibernate 实例共享的二级缓存

mysql - Hibernate 不通过 native 查询更新值

java - MySQL 数据库连接几分钟后断开

java.lang.IllegalArgumentException : Removing a detached instance of StudentSubject

hibernate - 从Netbeans JPA添加 hibernate 到现有的Jersey项目

java - 用对象对列表进行排序?

java - Android:CertPathValidatorException:找不到证书路径的信任 anchor

java - 如何在 GWT RPC 中使用 util.List