Hibernate: Duplicate entry for key错误排查

背景:

公司业务需求:

1.合并两个用户,包括资产账户信息。
2.其中用户的积分账户有身份证号码(idNum)与真实姓名(realName)信息,且为联合唯一索引。
3.为了描述方便,假设两个用户A与B,需要把用户B的账户信息合并到用户A账户。且用户B账户idNum与realName字段不为空(realName:张三,idNum:123),用户A的账户idNum与realName为空。

字段A用户B用户
真实姓名张三
身份证号码123

问题:

在合并时:
1.开启事务;
2.首先把B用户的idNum与realName信息填写到A用户账户中;
3.再把B用户的idNum与realName更新成“张三-1”、“123-1”;
4.更新B用户账户;
5.更新A用户账户;
6.提交事务(报错!!!

原因:

报错为有两条数据违反了唯一索引规则。也就是说有两个数据的idNum与realName数据一致,都是“张三”+“123”!
我是先更新B账户的数据后才进行更新A账户,正常理解为,此时A账户realName与idNum为“张三”+“123”,B的已经被修改为其他数据,应该只有一条数据为“张三”+“123”的情况,为什么还会报“Duplicate entry”呢?

推测:

由于没有研究hibernate源码,不敢妄下结论。由于开启事务,所有更新数据还都在缓存中,没有写入数据库。此时,数据状态应该是如下情况:
在这里插入图片描述
在提交事务时,开始校验数据。发现缓存中A用户账户与数据库中B用户账户的唯一索引值相同,然后就抛出了异常。

解决方法:

在设置A用户账户的idNum与realName之前,保存B账户的idNum与realName,然后更新B账户idNum=123-1,realName=张三-1,然后更新B账户后,调用flush()方法把缓存数据刷入数据库,此时数据库中就不存在“张三”+“123”的数据。最后提交事务也就没有问题了。

总结:

该推测不一定正确,需要进一步查看hibernate的官方文档来证实!还需要了解hibernate bean的三种状态:transient(瞬时状态),persistent(持久化状态)以及detached(游离状态)!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值