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

问题:org.hibernate.NonUniqueObjectException: a different object with the same identifier value was already associated with the session:……


        主键不唯一,在事务的最后执行SQL时,session缓存里面有多个(>1)主键一样的对象
 

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


可能的场景:

1、同一个object,如一个person在seession里保存了一份,而增加的别的object,如company的时候,由于做了关联关系,从数据库里又get了一个person,而这个person和seession里的person是同一个,把get出来的person   set 到了company里,像这样,compnay.setPerson(person).在增加company的时候就出现了这个错误。

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

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

解决办法:

1.不要重新new一个对象,使用load的对象对他进行更改值。
例如上面例子直接对user1操作,最后更新user1
2.如果是hibernate3以上,可以使用session.merge()方法
3.把session中同标识的对象移出(session.evict(user1)),使他成为脱管的状态,然后user2就可以update了。


 

上一篇:gradle 1


下一篇:YOLOv4论文翻译