zoukankan      html  css  js  c++  java
  • org.hibernate.NonUniqueObjectException: A different object with the same identifier value was already associated with the session

      昨天在使用hibernate的过程中, 在执行update 某个对象的时候, 出现了这个问题,后来在网上查了下,说原因是:

      在同一个session内,如果已经有一个对象已经是持久化状态(load进来等),现在构造一个新的PO,和前一个持久化对象拥有相同的持久化标识(identifier),在update的时候,就会抛这个错误。

      然后我检查了下代码,确实是有这个问题:我在前面手工new了一个对象,id也设置进去了, 然后在后面我又做了个经验值区间是否重合的校验,这个校验需要把所有的对象都从数据库里查出来,这样

      的话, 在session里就确实出现了两个有相同持久化标识(identifier)的对象了, 后来我在校验的代码逻辑里,改了下, 就是在这个对象校验完之后,我把这个对象移除掉:

      

      

      加完后,再执行update 后, 就没有这个问题了。

      总结下:

      什么情况下出现这个问题

      

    1 User user1 = session.load(1);  
    2 User user2 = new User();  
    3 user2.setId(1);//此时ID和user1一样  
    4 user2.setUsername("lalala");  
    5 session.update(user2);//这里会抛出错误 

      解决方法:

         1.不要重新new一个对象,使用load的对象对他进行更改值。例如上面例子直接对user1操作,最后更新user1

        2.如果是hibernate3以上,可以使用session.merge()方法
        3.把session中同标识的对象移出(session.evict(user1)),使他成为脱管的状态,然后user2就可以update了。

  • 相关阅读:
    strcpy和memcpy的区别(转)
    获得discuz7.2 目录下所有文件,并写到txt
    Lintcode: Majority Number 解题报告
    Lintcode: Fast Power 解题报告
    LeetCode: Pow(x, n) 解题报告
    Lintcode: Minimum Subarray 解题报告
    Lintcode: Subarray Sum 解题报告
    LeetCode: Minimum Depth of Binary Tree 解题报告
    LeetCode: Binary Tree Maximum Path Sum 解题报告
    LeetCode: Binary Tree Postorder Traversal 解题报告
  • 原文地址:https://www.cnblogs.com/xiexin2015/p/8993952.html
Copyright © 2011-2022 走看看