解决hibernate的孤子问题 hibernate缓存问题

比如我们现在有一个Parent的实体,在Parent实体当中有一个children的Set
由于这个children的数据并非非常重要,为了方便,我们在修改parent的时候,做法经常都是
1,清空children全部删了,再把新的children全部加进去。
今天早上做这一方面工作的时候遇到一个问题,就是在更新parent的时候,报了一个
Don't dereference a———— collection withcascade="all-delete-orphan"
的异常,经常一半个小时的查资料和调试,终于找到了解决问题的办法
刚刚开始我的做法为:
parent = parentService.findParentById(id);
parent.getChildren.clear();
parent.setChildren(newChildren);
parentService.updateparent(parent);
这样做一定会报出一个Don't dereference a collection withcascade="all-delete-orphan"的异常
原来是,对于parent的children这个Set,它本身是一个持久的集合,该集合存在于hibernate的对象池当中,通过
parent.setChildren(newChildren)的设置之后,本身已经将parent对children集合的引用指到对象池外的一个集合。
后来查询资料后的做法为:
parent = parentService.findParentById(id);
parent.getChildren.clear();//必须这样写,先clear,然后用getSet.add(...)
parent.getChildren.addAll(newChildren);
parentService.updateparent(parent);
做了几次测试,问题解决。
hbm配置如下:
<set lazy="true" name="children"cascade="all,delete-orphan" inverse="true">
<keycolumn="PARENT_ID"/>
<one-to-many/>
</set>
另外,hibernate3已经将cascade当中的选项做了修改,现在已经没有了all-delete-orphan这个选项,虽然hibernate
内部还是支持这个选项……

JPA的实现如果是hibernate,直接
如果是hibernate的实现的话, 在@OneToMany
旁边加上:@Cascade(org.hibernate.annotations.CascadeType.DELETE_ORPHAN)
最新的JPA ,CascadeType.DELETE_ORPHAN已经过期
说明如下:
DELETE_ORPHAN
Deprecated.use@OneToOne(orphanRemoval=true) or@OneToMany(orphanRemoval=true)


问题反应:

级联新增,删除都ok;
级联更新时,修改从表内容的update,新增也ok,就是删除不ok.

以下贴出代码部分,望大家能够指点.

public class Account implements java.io.Serializable
{
privateString id;
privateString name;
privateString enabled;
privateSet<Acct2group> acct2groups = newHashSet<Acct2group>(0);

@OneToMany(cascade = CascadeType.ALL, mappedBy = "account")
解决hibernate的孤子问题 hibernate缓存问题
publicSet<Acct2group>getAcct2groups()
{
return this.acct2groups;
}

将Account类查出后,

Account account = dao.findById(1);
Set set = account.getAcct2groups();//此时set结果集为4
set.clear();
em.merge(account);

事务是spring控管的,做别的持久层动作都没问题.
就是不能将remove掉的4个Acct2group对象,重DB中删除.
将set.clear换成set.iterator().hasNext()迭代remove也不可以.

  

爱华网本文地址 » http://www.aihuau.com/a/25101015/262710.html

更多阅读

怎样解决U盘无法识别问题 u盘不能被识别

怎样解决U盘无法识别问题——简介现在的数码产品基本都离不开USB设备,但是如果系统无法识别USB设备的时候,就会给我们造成各种困扰,那么遇到USB设备无法识别该怎么办呢?小编教大家几种方法,轻松解决电脑无法识别U盘的问题。怎样解决U盘

厂办大集体改革的人员安置问题 南方电网改革人员安置

(2011-06-30 12:50:04)国务院国资委研究中心主任李保民说:“厂办大集体改革改到深处是产权,改到难处是人员,改到痛处是转换(即转换经营机制、发展方式)。”,厂办集体企业改革的难点和核心是职工安置,职工安置的背后是产权。中美嘉伦认为

声明:《解决hibernate的孤子问题 hibernate缓存问题》为网友天授唱诗人分享!如侵犯到您的合法权益请联系我们删除