Hibernate 异常:Illegal attempt to associate a collection with two open sessions

Hibernate 异常: 
Illegal attempt to associate a collection with two open sessions 
今天在做项目发现的问题: 
1.如以下找到的资料之一: 
错误信息: 
org.springframework.orm.hibernate3.HibernateSystemException: Illegal attempt to associate a collection with two open sessions; 

错误原因: 
1. 一个Action在两个线程中同时运行,造成并发。 
解决方法:   
1.经常debug 测试  终于发现了一个问题: 
原来属性重名了 
我在Action中已经注入了实体类 
private Mission mission; 
在下面某个内部类方法中也重名的定义 
Mission mission = misList.get(0); 
并且他们都被调用了同一方法 
missionBussiness.addData(mis); 
处理结果:改掉其中的一个属性名,错误仍然存在。 

2.问大神 : 
在pring配置文件中的action bean中添加属性  scope="prototype" 
问题依然存在。 
3.最后在别人的博客里终于找到一个可以解决我问题的方案: 
使用hibenate的merge方法代替save、update等方法。 
merge和saveOrUpdate方法区别在于:merge方法是把我们提供的对象转变为托管状态的对象;而saveOrUpdate则是把我们提供的对象变成一个持久化对象;说的通俗一点就是:saveOrUpdate后的对象会纳入session的管理,对象的状态会跟数据库同步,再次查询该对象会直接从session中取,merge后的对 象不会纳入session的管理,再次查询该对象还是会从数据库中取。所以一般建议用merge 

将MissionDaoImpl类中的 this.getHibernateTemplate().save(data);    save方法改为了merge方法 

将此方法:public boolean addData(Object data) throws Exception { 
this.getHibernateTemplate().save(data); 
return true; 

改为: 
public boolean addData(Object data) throws Exception { 
this.getHibernateTemplate().merge(data); 
return true; 

将MissionDaoImpl类中的 this.getHibernateTemplate().update(data);    update方法改为了merge方法 

将此方法:public void update(Object data) throws Exception { 
super.getHibernateTemplate().update(data); 

改为:public void update(Object data) throws Exception { 
super.getHibernateTemplate().merge(data); 

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值