首页 > Web开发 > 详细

org.hibernate.NonUniqueObjectException:a different object with the same identifier value was alread

时间:2017-06-24 23:17:37      阅读:301      评论:0      收藏:0      [点我收藏+]

转自: http://blog.csdn.net/zzzz3621/article/details/9776539

看异常提示意思已经很明显了,是说主键不唯一,在事务的最后执行SQL时,session缓存里面有多个(>1)主键一样的对象。

了解过hibernate的都知道它有一个一级缓存,即session级别的缓存,在一个事务的执行过程中可以管理持久化对象,在事务最后执行SQL,可以减少数据库的操作。

 

报这个异常就得仔细看看你的代码,一定有地方引用的对象已经不同了。

下面就是一个典型的例子:

 

[java] view plain copy
 
  1. public void update(Object obj){  
  2. fillObject(obj);  
  3. session.update(obj);  
  4. }  
  5.   
  6. public void fillObject(Object obj){  
  7. Object obj2 = session.load(obj.getId());  
  8. //DO 设置obj2的属性  
  9. //错误的地方  
  10. obj = obj2;  
  11. }  

 


正确的应该是

 

[html] view plain copy
 
  1. public void update(Object obj){  
  2. obj = fillObject(obj);  
  3. session.update(obj);  
  4. }  
  5.   
  6. public Object fillObject(Object obj){  
  7. Object obj2 = session.load(obj.getId());  
  8. //DO 设置obj2的属性  
  9.   
  10. return obj2;  
  11. }  

 

 

 

技术分享

 

错误的情况:在刚调用fillObject方法的时候obj(fillObject)是1的状态,后面变成了2。但是obj(update)一直是指向obj的,当执行完fillObject后,session已经存放了obj2,再将obj更新到数据库的时候就会出错。

org.hibernate.NonUniqueObjectException:a different object with the same identifier value was alread

原文:http://www.cnblogs.com/heyanan/p/7074747.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!