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源码,不敢妄下结论。由于开启事务,所有更新数据还都在缓存中,没有写入数据库。此时,数据状态应该是如下情况:
Hibernate: Duplicate entry for key错误排查_第1张图片
在提交事务时,开始校验数据。发现缓存中A用户账户与数据库中B用户账户的唯一索引值相同,然后就抛出了异常。

解决方法:

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

总结:

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

你可能感兴趣的:(遇到的问题)