Hibernate级联:应该在父删除子级上设置为null吗?

时间:2010-04-18 08:16:44

标签: java hibernate

每当Session刷新时,

Collection.clear()都会删除子项。

OneToOne怎么样?设置为null不是正确的方法。没有针对OneToOne的clear()方法。

Table_A有一个列(不是它的PK!)OneToOne引用Table_B。

我想知道Hib在我的案例中是否按预期工作?

我的级联选项设置为“all,delete-orphan”。

Table_A @OneToOne Table_B

Table_B @OneToMany Table_C

现在它看起来像Table_A。 getTable_B。 getTable_C_Collection()

假设Table_C集合中有元素。

我对Hibernate的期望:如果我将Table_B链接设置为null,那么

必须删除所有Table_C集合元素。

没有发生。他们变得孤立!

3 个答案:

答案 0 :(得分:2)

您是否尝试过“all-delete-orphan”而不是“all,delete-orphan”?这两个应该是相同的,但过去有一个问题,一个人有不同的行为。这些问题实际上是错误,所以如果使用一个而不是另一个确实表现不同,请务必open a bug

您可能还想在Hibernate映射中设置inverse='true'。从documentationthis Stack Overflow Question开始,看起来inverse = true通常是让级联删除正常工作的关键。

答案 1 :(得分:1)

不,如果您已启用级联,则删除父级将删除子级。

您需要将DELETE SQL发送到数据库,而仅将引用设置为null将不会这样做。

答案 2 :(得分:1)

Hibernate对级联操作的支持有时候会有点古怪。如果您发现无法获得所需的开箱即用行为,则可以实施Hibernate Interceptor or a Hibernate event listener。实际上很容易做以太,而且这个努力是值得的(你的主要代码仍然很干净)。

在这种情况下,您可能希望实施PostUpdateEventListenerPreUpdateEventListener