小编典典

从4.2.7 / 4.3.0.CR1开始,Hibernate JPA OneToOne孤立删除仍然无法正常工作

hibernate

阅读了 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语句。

那么,此@OneToOne(cascade = CascadeType.ALL, orphanRemoval = true)问题是否已解决?如果是这样,我如何删除这些orphan?非常感谢!

编辑:阅读您的答案后,我注意到我(错误地)省略了fetch=FetchType.LAZY在我上面的映射中指定的内容。


阅读 269

收藏
2020-06-20

共1个答案

小编典典

好的,将关系设置为新实例后,所涉及的问题与级联删除有关。您将设置为null,因此它实际上不是相同的。

我在Hibernate4.1.8下测试了您的代码(即,将Post设置为null),并且在删除Post条目后可以正常工作。我测试了将Post设置为现有Point的新实例,并且 触发删除操作,这与您提到的问题一致。

然后,我在4.2.7下进行了测试,并且在两种情况下均触发了删除操作,因此您所提到的问题确实在4.2.7中得以解决。

更新:

我看不到为什么Fetch提示会影响持久性操作,但是我尝试将其放在适当的位置,结果与以前一样。

2020-06-20