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

本文通过实例解析了Hibernate中的merge和update方法的区别,包括它们如何在缓存中处理相同标识符的对象,以及执行前后的操作差异。重点阐述了merge方法在执行更新前的缓存查找和数据合并过程,而update方法则直接执行更新操作,不涉及缓存检查。
使用 session.merge(object) 解决
示例:
[b]merge和saveorupdate()到底有什么区别呢?看一段代码: [/b]

 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合并。 注意:[b]merge方法在执行之前都回去缓存中找是不是有相应的记录,也就是会有一条select语句,执行改语句的目的是为了判断该对象是否被修改了。而update就不管这些,直接就一条update语句。[/b]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值