Java 从4.2.7/4.3.0.CR1起,Hibernate JPA OneToOne孤立项删除仍不起作用

Java 从4.2.7/4.3.0.CR1起,Hibernate JPA OneToOne孤立项删除仍不起作用,java,hibernate,jpa,jpa-2.0,one-to-one,Java,Hibernate,Jpa,Jpa 2.0,One To One,读过 ,以及相关的问题,我推断这已经(最终)在版本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 { .

读过 ,以及相关的问题,我推断这已经(最终)在版本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,orphanRemoving=true)
问题是否已经解决?如果是这样,我该如何删除孤儿?非常感谢

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

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

我在Hibernate 4.1.8下测试了您的代码(即,将Post设置为null),它在删除Post条目时按预期工作。我测试了将Post设置为现有点的新实例,删除未触发,这与您提到的问题一致

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

更新:


我不明白为什么Fetch提示会影响持久化操作,但是我已经尝试过了,结果与以前一样。

我使用4.2.2版本进行了测试,所有情况都有效。双向、单向也起作用。编辑问题后,将默认获取模式恢复为
FetchType。在4.2.6和4.2.7中调用-
setPost(null)
时,EAGER
会删除孤立项,仅在4.2.7中调用-
setPost(new Post())
(修复于)。使用
FetchType.LAZY
时,无论是
setPost(null)
还是
setPost(new Post())
都不会触发孤立删除(在4.2.6或4.2.7中)。请参见上面的“我的编辑”。JPA将OneToOne关系的FetchType默认为EAGER(否则为LAZY)。在我的例子中,对于FetchType.LAZY,代码段无法删除孤立的Post实体。这对于4.2.6和4.2.7同样适用。6484修复程序在设置新实例(而不仅仅是
null
)时会更正孤立删除,但在4.2.7中,对于FetchType.LAZY,这也会失败。@AlanHay:在这种情况下,Hibernate在使关联延迟加载方面不会有任何问题。问题在于外键何时在另一个表中,或者PK何时也是FK,因为在这种情况下,它无法从行中的数据判断是否存在关联实体。当FK在表中时,没有问题,因为空FK意味着关联为空,反之亦然。是的,你说得很对。在这种情况下,关联可能是惰性的。总之,我们都在看一些似乎不存在的问题。@AlanHay:读过这篇文章后,我现在理解了
optional=false/true
和代理问题。但是,为什么Hibernate会发出SELECT语句,在惰性情况下不使用(
optional=true
)获取Post实体?至于“不存在的问题”:我在版本4.2.7中再次尝试了这个片段(
setPost(null)
),但仍然没有发出DELETE语句。由于我希望关系为optional=true,因此我假设简单的答案是将fetch模式保留为
EAGER
。但我仍然不相信在
懒惰
的情况下,一切都会正常运行。@okiharaherbst:我可以确认,在Hibernate 4.2.15中,删除孤儿在
懒惰
的情况下仍然不起作用。