您的位置:首页 > Web前端

Don't dereference a collection with cascade="all-delete-orphan" ,这是14年遇到的问题,最近在博客上进行整理汇总

2016-10-31 10:06 661 查看
如我们现在有一个Parent的实体,在Parent实体当中有一个children的Set

由于这个children的数据并非非常重要,为了方便,我们在修改parent的时候,做法经常都是

1,清空children全部删了,再把新的children全部加进去。

今天早上做这一方面工作的时候遇到一个问题,就是在更新parent的时候,报了一个

Don't dereference a collection with cascade="all-delete-orphan"

的异常,经常一半个小时的查资料和调试,终于找到了解决问题的办法

刚刚开始我的做法为:

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的对象池当中,通过

parent.setChildren(newChildren)的设置之后,本身已经将parent对children集合的引用指到对象池外的一个集合。

后来查询资料后的做法为:

parent = parentService.findParentById(id);

parent.getChildren.clear();

parent.getChildren.addAll(newChildren);

parentService.updateparent(parent);

做了几次测试,问题解决。

第二中

hbm还可更改hbm的配置 :

原来是

<set lazy="true" name="children" cascade="all-delete-orphan" inverse="true">

<key column="PARENT_ID"/>

<one-to-many class="Child"/>

</set>

修改为:

<set lazy="true" name="children" cascade="save-update,delete" inverse="true">

<key column="PARENT_ID"/>

<one-to-many class="Child"/>

</set>

测试通过!

另外,hibernate 3已经将cascade当中的选项做了修改,现在已经没有了all-delete-orphan这个选项,虽然hibernate

内部还是支持这个选项……
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  cascadeall-delete-or
相关文章推荐