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
。我无法发布代码;它属于我工作的公司。但我尝试用你的例子,以某种方式复制这种行为。到目前为止,运气不佳。