阅读了 JPA 2.0 / Hibernate和“orphanRemoval”:仅替换一个实体并不会删除旧的实体和相关票据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语句。
DELETE
Post
那么,此@OneToOne(cascade = CascadeType.ALL, orphanRemoval = true)问题是否已解决?如果是这样,我如何删除这些orphan?非常感谢!
@OneToOne(cascade = CascadeType.ALL, orphanRemoval = true)
编辑:阅读您的答案后,我注意到我(错误地)省略了fetch=FetchType.LAZY在我上面的映射中指定的内容。
fetch=FetchType.LAZY
好的,将关系设置为新实例后,所涉及的问题与级联删除有关。您将设置为null,因此它实际上不是相同的。
我在Hibernate4.1.8下测试了您的代码(即,将Post设置为null),并且在删除Post条目后可以正常工作。我测试了将Post设置为现有Point的新实例,并且未 触发删除操作,这与您提到的问题一致。
然后,我在4.2.7下进行了测试,并且在两种情况下均触发了删除操作,因此您所提到的问题确实在4.2.7中得以解决。
更新:
我看不到为什么Fetch提示会影响持久性操作,但是我尝试将其放在适当的位置,结果与以前一样。