阅读 JPA 2.0 / Hibernate and "orphanRemoval": Just replacing an entity does not remove the old one以及相关的票证https://hibernate.atlassian.net/browse/HHH-6484,我推断这已经(最终)在版本4.2.7和4.3.0.CR1中得到修复。
然而,尝试
...
entityManager.getTransaction().begin();
Point point = entityManager.find(Point.class, pointId);
point.setPost(null);
entityManager.getTransaction().commit();
...
其中
public class Point {
...
@OneToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY, orphanRemoval = true)
private Post post;
...
public void setPost(Post post) {
this.post = post;
}
}
仍然没有让Hibernate为目标DELETE
实体发出Post
SQL语句。
这个@OneToOne(cascade = CascadeType.ALL, orphanRemoval = true)
问题是否得到修复?如果是这样,我该如何删除孤儿?非常感谢!
编辑:
在阅读完答案之后,我注意到我(错误地)省略了我在上面的映射中指定fetch=FetchType.LAZY
。
答案 0 :(得分:2)
好的,当您将关系设置为新实例时,您引用的问题与级联删除有关。您将设置为null,因此它实际上并不相同。
我在Hibernate 4.1.8下测试了你的代码(即将Post设置为null),它按预期工作,删除了Post条目。我测试了将Post设置为现有Point的新实例,并且删除了不,这与您引用的问题一致。
然后我在4.2.7下进行了测试,并且针对这两种情况都删除了删除,因此您引用的问题确实在4.2.7中得到修复。
更新
我不明白为什么Fetch提示会影响持久化操作,但我已尝试使用它并且结果与以前一样。