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了。

  • 相关阅读:
    修复 Visual Studio Error “No exports were found that match the constraint”
    RabbitMQ Config
    Entity Framework Extended Library
    Navisworks API 简单二次开发 (自定义工具条)
    NavisWorks Api 简单使用与Gantt
    SQL SERVER 竖表变成横表
    SQL SERVER 多数据导入
    Devexpress GridControl.Export
    mongo DB for C#
    Devexress XPO xpPageSelector 使用
  • 原文地址:https://www.cnblogs.com/xiexin2015/p/8993952.html
Copyright © 2011-2022 走看看