Hibernate DELETE_ORPHAN CascadeType在集合设置为null时不删除孤立

时间:2009-12-03 22:38:05

标签: hibernate

当我将集合设置为null时,Hibernate不会删除孤立,尽管在清除集合时会删除孤立。我有以下协会。

D - entity, contains a single embedded E
E - embedded object, contains one to many relationship with F (cascade type all,DELETE_ORPHAN)
F - entity, contains a collection of Strings

请注意,因为E嵌入在D中,所以在数据库E中没有D以外的身份。因此我将D / E称为一个单元。另请注意,F包含一系列字符串。由于hibernate的限制,这意味着F必须是实体,而不是可嵌入的值类型。 E中Fs集合的级联类型包括all和DELETE_ORPHAN。

如果我想从D / E中删除Fs的集合,我可以明确地清除集合中的所有Fs,就像这样。

D d = //get a reference to a D
E e = d.getE();
Set<F> fs = e.getFs();
fs.clear();
//... update d in the session

这正确地从F表中删除了与D / E有关的F的所有数据库行以及从D / E到F连接表的相关行,正如我所料。但是,假设我想将Fs的集合设置为null,就像这样。

D d = //get a reference to a D
E e = d.getE();
e.setFs(null);
//... update d in the session

虽然这会删除连接表中D / E和F之间的关系,但它不会从F表中删除与D / E相关的F的数据库行。这些数据库行现在是孤立的。

是否有一个hibernate设置允许将Fs的集合设置为null并让hibernate意识到原始集合中的所有F现在都是孤立的?

1 个答案:

答案 0 :(得分:4)

你怎么认为Hibernate会知道它应该删除你所有的F个实体?

Transitive persistence需要可达性;为了让Hibernate知道所有(或某些)集合元素都已被删除,它会将自己的集合类替换为跟踪这些更改的集合类。

创建/实例化后,永远不会删除对集合的引用;如果您这样做,则更改会丢失(无论是在幕后静默还是在某些情况下都可能会出现异常)。

使用clear()是告诉Hibernate你想要删除集合元素的正确方法。