這個問題很久以前我遇見過,找到了解決辦法,原出處已經(jīng)忘了,文章如下:
比如我們現(xiàn)在有一個Parent的實體,在Parent實體當(dāng)中有一個children的Set
由于這個children的數(shù)據(jù)并非非常重要,為了方便,我們在修改parent的時候,做法經(jīng)常都是
1,清空children全部刪了,再把新的children全部加進去。
今天早上做這一方面工作的時候遇到一個問題,就是在更新parent的時候,報了一個
Don't dereference a collection with cascade="all-delete-orphan"
的異常,經(jīng)常一半個小時的查資料和調(diào)試,終于找到了解決問題的辦法
剛剛開始我的做法為:
parent = parentService.findParentById(id);
parent.getChildren.clear();
parent.setChildren(newChildren);
parentService.updateparent(parent);
這樣做一定會報出一個Don't dereference a collection with cascade="all-delete-orphan"的異常
原來是,對于parent的children這個Set,它本身是一個持久的集合,該集合存在于hibernate的對象池當(dāng)中,通過
parent.setChildren(newChildren)的設(shè)置之后,本身已經(jīng)將parent對children集合的引用指到對象池外的一個集合。
后來查詢資料后的做法為:
parent = parentService.findParentById(id);
parent.getChildren.clear();
parent.getChildren.addAll(newChildren);
parentService.updateparent(parent);
做了幾次測試,問題解決。
hbm配置如下:
<set lazy="true" name="children" cascade="all,delete-orphan" inverse="true">
<key column="PARENT_ID"/>
<one-to-many class="Child"/>
</set>
另外,hibernate 3已經(jīng)將cascade當(dāng)中的選項做了修改,現(xiàn)在已經(jīng)沒有了all-delete-orphan這個選項,雖然hibernate
內(nèi)部還是支持這個選項……