现在的位置: 首页 > 综合 > 正文

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

2014年03月31日 ⁄ 综合 ⁄ 共 650字 ⁄ 字号 评论关闭

看异常提示意思已经很明显了,是说主键不唯一,在事务的最后执行SQL时,session缓存里面有多个(>1)主键一样的对象。

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

报这个异常就得仔细看看你的代码,一定有地方引用的对象已经不同了。

下面就是一个典型的例子:

public void update(Object obj){
fillObject(obj);
session.update(obj);
}

public void fillObject(Object obj){
Object obj2 = session.load(obj.getId());
//DO 设置obj2的属性
//错误的地方
obj = obj2;
}

正确的应该是

public void update(Object obj){
obj = fillObject(obj);
session.update(obj);
}

public Object fillObject(Object obj){
Object obj2 = session.load(obj.getId());
//DO 设置obj2的属性

return obj2;
}

错误的情况:在刚调用fillObject方法的时候obj(fillObject)是1的状态,后面变成了2。但是obj(update)一直是指向obj的,当执行完fillObject后,session已经存放了obj2,再将obj更新到数据库的时候就会出错。

抱歉!评论已关闭.