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

  • Post author:
  • Post category:其他



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);




}




版权声明:本文为u010649730原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。