背景:

公司业务需求:

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(游离状态)!

Hibernate: Duplicate entry for key错误排查相关推荐

  1. java向数据库插入数据时的错误: Duplicate entry ‘‘ for key ‘PRIMARY‘ 问题解决

    java向数据库插入数据时的错误: Duplicate entry '' for key 'PRIMARY' 问题解决 参考文章: (1)java向数据库插入数据时的错误: Duplicate ent ...

  2. Duplicate entry...for key...

    Duplicate entry...for key...的错误原因是主键的唯一值重复,在对数据库进行修改.插入操作时,一但主键的唯一值重复就会报此错误,有时在表中存在多个主键时,对表操作仍然报此错误, ...

  3. MySQL5.7创建唯一索引时报错提示Duplicate entry * for key *

    一.报错原因 因表中创建唯一索引的列有重复数据,导致创建唯一索引时报错提示Duplicate entry * for key * 二.报错演示 例如lz用户表中用户名.邮箱和创建时间三列属性中存在相同 ...

  4. Duplicate entry ‘***‘ for key ‘UK_mjrobjw9m8n29ou6083ixjxmf‘

    后台运行报错Duplicate entry '***' for key 'UK_mjrobjw9m8n29ou6083ixjxmf' 检查sql语句,看数据库里面唯一的字段,你在添加或者修改的时候重复

  5. Duplicate entry '??…???' for key 'cname' Query:

    今天开发过程中,进行数据修改Update 时遇到了个问题Duplicate entry '??-???' for key 'cname' Query: 这报错是 代表数据表中 字段xxx中 已经的这个 ...

  6. java duplicate entry_java向数据库插入数据时的错误: Duplicate entry '' for key 'PRIMARY' 问题解决...

    错误提示为:你插入的记录与数据表中原有记录的主键重复了(Duplicate).所以插入失败 mysql主键设置成auto_increment时,进行并发性能测试出现主键反复Duplicate entr ...

  7. mysql 出现错误 Duplicate entry for key PRIMARY 解决办法

    原来是没有主键的,想增加一列为主键. mysql> desc t111; +-------+-------------+------+-----+---------+-------+ | Fie ...

  8. mysql slave duplicate entry_slave 报Duplicate entry for key

    今天slave机器报如下错误 [ERROR] Slave SQL: Error 'Duplicate entry '7301' for key 'PRIMARY'' on query. Default ...

  9. Duplicate entry for key 'PRIMARY'

    错误场景: 更新同事代码之后启动报错,代码中的bug 具体的堆栈信息: com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolatio ...

最新文章

  1. python必背内容-python必背函数
  2. 用js改变embed标签的src值
  3. 设计模式在C语言中的应用--读nginx源码
  4. qt 背景和控件布局_Qt控件背景图片设置总结
  5. LeetCode 1410. HTML 实体解析器(哈希map)
  6. windows installer没有正确安装_电脑还可以这样禁止软件自动安装,后悔知道得太晚...
  7. python基础到实践教程_Python从入门到实践案例教程(21世纪高等学校计算机教育实用规划教材)...
  8. 4-2 数据模型的生成
  9. 经典神经网络 -- SSD : 设计原理与pytorch实现
  10. 阿里HSF(服务框架)
  11. NIOS软核处理器入门实验
  12. ANSYS WORKBENCH基础学习之应力奇异及位移结果对比
  13. QGroundControl 提示 Power redundancy not met: 0 instead of 1
  14. Java并发编程-Volatile和Syncronized关键字
  15. 解析:为什么设计师选择mac电脑居多?
  16. 三星i865刷android,三星S11加持黑科技,16GB+骁龙865,手机流畅度超越电脑
  17. 境界的彼方_lduoj_bfs宽搜
  18. Spark学习痛点和路线图
  19. 人人商城快速购买显示售罄图标
  20. 金融基础概念--股票

热门文章

  1. 完美解决KMplayer无法播放RMVB、RM电影问题
  2. Vue动态绑定class
  3. Android开发板 MTK 4g/5g 安卓开发板定制
  4. 中小互联网软件公司的骗局--前言
  5. 真正手把手教你用unity接入苹果内购(IAP)
  6. 致我终将逝去的青春——毕业后的我
  7. 数据库审计是什么意思?作用是什么?
  8. Skype免费网络电话瞄准主流市场
  9. 车间调度-灰狼算法的应用:以算例MK01为例
  10. 程序员3~5年后如何规划自己