我有两个通过双向 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
实例时,我将其从其 One
的 manies
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/