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

时间:2013-11-29 07:15:23

标签: java hibernate jpa jpa-2.0 one-to-one

阅读 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

1 个答案:

答案 0 :(得分:2)

好的,当您将关系设置为新实例时,您引用的问题与级联删除有关。您将设置为null,因此它实际上并不相同。

我在Hibernate 4.1.8下测试了你的代码(即将Post设置为null),它按预期工作,删除了Post条目。我测试了将Post设置为现有Point的新实例,并且删除了,这与您引用的问题一致。

然后我在4.2.7下进行了测试,并且针对这两种情况都删除了删除,因此您引用的问题确实在4.2.7中得到修复。

更新

我不明白为什么Fetch提示会影响持久化操作,但我已尝试使用它并且结果与以前一样。