`

org.hibernate.NonUniqueObjectException: a different object with the same identif

阅读更多
使用 session.merge(object) 解决
示例:
merge和saveorupdate()到底有什么区别呢?看一段代码:

 Session session = this.getSession();     
 Transaction tr = session.beginTransaction();     
 User exituser = (User)session.get(User.class, new Integer(1));         tr.commit();     
session.close();     
 session = getSession();     
 tr = session.beginTransaction();     
 User exituser2 = (User)session.get(User.class, new Integer(1));     session.update(exituser);    
 tr.commit();     
session.close();     

运行上面的代码,hibernate给我们报了一个错误:a different object with the same identifier value was already associated with the session。意思是,在session缓存中以两个标识相同的对象,这是不可以的。那么,吧update改成merge会怎么样呢?改为merge后,一切OK,运行正常。其实merge在执行更新之前会将两个标识符相同的对象进行合并,具体合并的方向是向exituser2合并。    注意:merge方法在执行之前都回去缓存中找是不是有相应的记录,也就是会有一条select语句,执行改语句的目的是为了判断该对象是否被修改了。而update就不管这些,直接就一条update语句。
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics