hibernate中一个session的两个对象有相同标示符的异常

关于hibernate中出现a different object with the same identifier value was already associated with the session的错误。

出现原因和解决方式:
出现该问题的原因:
    说到这里,我想我也应该重新认识下hibernate了,在hibernate中,对象状态分为三种:瞬时态(transient)、持久态(persistent)和游离态(detached)。其中瞬时态:就是用户自己定义的,通俗点说就是自己new出来的对象,还没有与session相关联,此时的对象为瞬时态;持久态:已经被持久化,与session相关联,加载到了session缓存中,session要负责把持久化的对象更新到数据库,此时的对象称为持久化对象;游离态:已经被持久化,但是不在session的缓存中了。
    这三种状态的转换过程为:

 

注:此图引用自http://blog.csdn.net/yyywyr/article/details/6645040。
在我的项目中,情况为在一个dao方法中,先使用find方法进行查询,这时查询出来的对象是处于持久化状态的,而执行deleteAll方法后,并没有立即同步到数据库,而是告诉session需要执行delete方法,session会计划执行delete语句,即这时对象的状态还是持久态,所以后面执行saveOrUpdate方法时会出现a different object with the same identifier value was already associated with the session的错误。
    解决方式:
    1. 将saveOrUpdate方法改为merge,说到这里我想应该再说下merge方法和saveOrUpdate方法的区别了,其中saveOrUpdate方法,即为save和update方法的结合,如果要执行该方法的对象已经持久化了,则该方法不进行任何操作,但是如果要执行该方法的对象与该session相关联的对象存在相同的标示符,则会抛出a different object with the same identifier value was already associated with the session的错误,因为。而merge方法处理这样的事情时,则会将新的对象赋值给持久态的对象,而自己本身不变为持久态,故可以将saveOrUpdate方法换为merge方法。
    2. 使用for循环迭代删除后,然后再迭代保存。for(;;)delete(obj);}  for(;;){save},在逐个执行delete方法时,删除的对象会从持久态变为游离态(但是最后一个可能会例外,这里我没有进行测试,有兴趣的朋友可自己测试下);
    故综上所述,我认为使用merge方法比较好。




 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值