解决a different object with the same identifier value was already associated with the session错误
转载自:
http://www.blogjava.net/hrcdg/articles/157724.html
这个错误产生原因相信大家都知道,因为在hibernate中同一个session里面有了两个相同标识但,是是不同实体,当这时运行saveOrUpdate(object)操作的时候就会报这个错误。
其实要解决这个问题很简单,只需要进行session.clean()操作就可以解决了,但是你在clean操作后面又进行了saveOrUpdate(object)操作,有可能会报出
"Found two representations of same collection",我找了很多资料,最后通过session.refresh(object)方法就可以解决了,注意,当object不是数据库中已有数据的对象的时候,不能使
用session.refresh(object)因为refresh是从hibernate的session中去重新取object,如果session中没有这个对象,则会报错所以当你使用saveOrUpdate(object)之前还需要判断一下
当然这个问题最容易解决的办法还是使用Hibernate里面自带的merge()方法。不过我始终觉得碰到问题就用这种软件自带的非常用方法(和saveOrUpdate(),save(),update()相比)感
觉十分不爽。后来我还发现这种错误经常出现在一对多映射和多对多映射,请大家在使用一对多和多对多映射的时候要小心一些Hibernate 疑难异常及处理
|
1、a different object with the same identifier value was already associated with the session。 错误原因:在hibernate中同一个session里面有了两个相同标识但是是不同实体。 解决方法一:session.clean() PS:如果在clean操作后面又进行了saveOrUpdate(object)等改变数据状态的操作,有可能会报出"Found two representations of same collection"异常。 解决方法二:session.refresh(object) PS:当object不是数据库中已有数据的对象的时候,不能使用session.refresh(object)因为该方法是从hibernate的session中去重新取object,如果session中没有这个对象,则会报错所以当你使用saveOrUpdate(object)之前还需要判断一下。 解决方法三:session.merge(object) PS:Hibernate里面自带的方法,推荐使用。 2、Found two representations of same collection 错误原因:见1。 解决方法:session.merge(object) 以上两中异常经常出现在一对多映射和多对多映射中 |
PS:
或者可以使用session.flush(),或者session.clear();
我的需求是要导入一批数据A,然后这些数据都只能存在一条记录,先查询,后循环保存使用saveOrUpdate(object)方法,但是数据A可能会有相同的数据,
所以我这里用了比较笨的方法报错,更新唯一性,就是用Set来记录更新实体的ID,如果有相同的ID,就只更新一个实体,就不会存在同一个ID,不同的实体在
同一个session进行更新了,也不会报异常了。
浙公网安备 33010602011771号