zoukankan      html  css  js  c++  java
  • org.hibernate.NonUniqueObjectException:a different object with the same identifier value was alread

    转自: 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更新到数据库的时候就会出错。

  • 相关阅读:
    js获取 DOM 里所有图片(包括背景和iframe)
    php 和 js互相调用
    mac 权限
    node 启动命令
    three.js THREE.MeshLine.js 回显3D路径
    Vue2, Vue3 开发单一html页面区别
    前端布局,相关链接
    jq国际化jquery.i18n.properties使用
    资料
    其它工具
  • 原文地址:https://www.cnblogs.com/heyanan/p/7074747.html
Copyright © 2011-2022 走看看