Java 从OneToMany集合中删除时EntityNotFoundException
我有两个实体通过双向一对一/多对一关系连接Java 从OneToMany集合中删除时EntityNotFoundException,java,hibernate,jpa,Java,Hibernate,Jpa,我有两个实体通过双向一对一/多对一关系连接 @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)
@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;
// ...
}
我进行了一点调试,发现集
是一个Hibernate持久集
,其中包含一个字段storedSnapshot
。这又是另一个仍然引用已删除实体的集合。我不知道为什么不从快照中删除此引用,但我怀疑这就是问题所在:我认为Hibernate会再次尝试删除实体,因为它在快照中,但不在实际集合中。我搜索了很长时间,但没有遇到其他人有类似的问题
我使用Hibernate4.2.2和SpringData1.6.0
我是否做了一些天生错误的事情?如何修复此问题?由于您的@OneToMany
关系具有孤立删除=true
,您不必从数据库中显式删除子元素,只需将其从集合中删除并保存父元素即可。因为您的@OneToMany
关系具有孤立删除=true
,您不必显式地从数据库中删除子元素,只需将其从集合中删除并保存父元素。尝试添加CascadeType.remove并删除
@OneToMany(mappedBy = "one", orphanRemoval = true, fetch = FetchType.EAGER, cascade = CascadeType.REMOVE, orphanRemoval = true)
然后执行以下删除操作
one.getManies().remove(manyToRemove);
oneDao.save(one);
编辑:
我已经创建了POC,请查看UserRepositoryIntegrationTest.departmentTestCase()尝试添加CascadeType.REMOVE和OrphanRemove
@OneToMany(mappedBy = "one", orphanRemoval = true, fetch = FetchType.EAGER, cascade = CascadeType.REMOVE, orphanRemoval = true)
然后执行以下删除操作
one.getManies().remove(manyToRemove);
oneDao.save(one);
编辑:
我已经创建了POC,请查看UserRepositoryIntegrationTest.departmentTestCase()我也遇到了同样的问题
解决方法是替换整个集合
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);
Set maniesBkp=one.getManies();//PersistentSet的实例
maniesBkp.移除(manyToRemove);
Set manies=new HashSet();
manies.addAll(maniesBkp);
一.塞特马尼斯(马尼斯);
...
manyDao.delete(manyToRemove);
...
一刀,救(一);
我也有同样的问题
解决方法是替换整个集合
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);
Set maniesBkp=one.getManies();//PersistentSet的实例
maniesBkp.移除(manyToRemove);
Set manies=new HashSet();
manies.addAll(maniesBkp);
一.塞特马尼斯(马尼斯);
...
manyDao.delete(manyToRemove);
...
一刀,救(一);
嗯,我也这么认为,但唉,它不起作用。顺便说一句,我也玩了级联,但这似乎造成了更多的问题,而不是它解决了。这就是为什么我决定手动管理这两个方面的原因,除了这里的一个小问题之外,这两个方面都可以很好地工作……并且在手动管理所有内容时删除orphanRemoving=true
?您是对的,这可能不再需要了。不幸的是,移除它也没有什么帮助。我也这么认为,但是,唉,它不起作用。顺便说一句,我也玩了级联,但这似乎造成了更多的问题,而不是它解决了。这就是为什么我决定手动管理这两个方面的原因,除了这里的一个小问题之外,这两个方面都可以很好地工作……并且在手动管理所有内容时删除orphanRemoving=true
?您是对的,这可能不再需要了。不幸的是,删除它也无济于事。这没有任何作用:(我知道它应该可以工作,但显然不行。嗯,请在某处发布您的示例代码(例如在github中)让它成为maven projectI。我尝试了你的POC。我不知道该告诉你什么。如果我调试你的测试,存储的快照会随着每次删除而更新。在我的应用程序中它不会更新。此外,当我在我的应用程序中使用与你的代码等效的代码时,persist不会设置引用集中实体的ID;它们只是停留在null
。我无法发布该代码;它属于我工作的公司。但我尝试使用您的示例并以某种方式复制该行为。到目前为止运气不佳。这没有任何作用。:(我知道它应该有效,但显然无效。嗯,请将您的示例代码发布到某个地方(例如在github中)让它成为maven projectI。我尝试了你的POC。我不知道该告诉你什么。如果我调试你的测试,存储的快照会随着每次删除而更新。在我的应用程序中它不会更新。此外,当我在我的应用程序中使用与你的代码等效的代码时,persist不会设置引用集中实体的ID;它们只是停留在null
。我无法发布代码;它属于我工作的公司。但我尝试用你的例子,以某种方式复制这种行为。到目前为止,运气不佳。