已阅读 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 为目标 Post
实体发出一个 DELETE
SQL 语句。
那么这个 @OneToOne(cascade = CascadeType.ALL, orphanRemoval = true)
问题是否已修复?如果是这样,我如何删除孤儿?非常感谢!
编辑:
阅读您的回答后,我注意到我(错误地)省略了在上面的映射中指定 fetch=FetchType.LAZY
。
最佳答案
好的,您提到的问题与将关系设置为新实例时的级联删除有关。您正在设置为 null,因此它实际上并不相同。
我在 Hibernate 4.1.8 下测试了您的代码(即将 Post 设置为 null),它按预期工作,删除了 Post 条目。我测试了将 Post 设置为现有 Point 的新实例,并且未触发删除,这与您提到的问题一致。
然后我在 4.2.7 下进行了测试,在这两种情况下都触发了删除操作,因此您提到的问题确实在 4.2.7 中得到了解决。
更新:
我不明白为什么 Fetch 提示会影响持久化操作,但我已经尝试使用它并且结果与以前一样。
关于java - 从 4.2.7/4.3.0.CR1 开始,Hibernate JPA OneToOne 孤立删除仍然不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20280271/