欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Hibernate异常Found shared references的解决办法

程序员文章站 2022-03-02 13:50:55
...
在项目中的续签模块中,由于在谈判成功后要新建一份合同,并要将原合同中的站点信息设置到新合同中去,在合同的Entity中有一个list<站点>来关联的,一份合同可以有多少站点!

在新增合同的代码如下:

RenewalItem item = renewalItemDao.findById(id);
PropertyContract pc = item.getPropertyContract();//旧合同
PropertyContract newPc = new PropertyContract();//新合同
List<BSProperty> bsList = pc.getBsProperty();
if(null!=bsList && !bsList.isEmpty()){
newPc.setBsProperty(bsList);//将旧合同中的关联站点设置到新合同中去。
}
....
renewalItemDao.merge(item);


此时会报:org.hibernate.HibernateException: Found shared references to a collection,这样的异常信息,意思是指发现共享引用集合,经过上网GOOGLE,有一帖子说:

解决方法:

在拷贝后,新建一个集合,将原来的集合元素添加进去,并赋值给新拷贝的实体


故将代码更改为:


RenewalItem item = renewalItemDao.findById(id);
PropertyContract pc = item.getPropertyContract();//旧合同
PropertyContract newPc = new PropertyContract();//新合同
List<BSProperty> bsList = pc.getBsProperty();
if(null!=bsList && !bsList.isEmpty()){
List<BSProperty> newBsList = new ArrayList<BSProperty>(bsList.size());
for(BSProperty bs : bsList){
newBsList.add(bs);
}
newPc.setBsProperty(newBsList);//将旧合同中的关联站点设置到新合同中去。
}
....
renewalItemDao.merge(item);


重新运行一次,问题解决了!!!
相关标签: hibernate entity