您的位置:首页 > 移动开发 > Objective-C

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

2016-01-27 17:22 806 查看
问题: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);//这里会抛出错误


3、。。。。。

解决办法:

1.不要重新new一个对象,使用load的对象对他进行更改值。

例如上面例子直接对user1操作,最后更新user1

2.如果是hibernate3以上,可以使用session.merge()方法

3.把session中同标识的对象移出(session.evict(user1)),使他成为脱管的状态,然后user2就可以update了。



参考http://fatkun.com/2011/04/org-hibernate-nonuniqueobjectexception.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: