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(游离状态)!
Hibernate: Duplicate entry for key错误排查相关推荐
- java向数据库插入数据时的错误: Duplicate entry ‘‘ for key ‘PRIMARY‘ 问题解决
java向数据库插入数据时的错误: Duplicate entry '' for key 'PRIMARY' 问题解决 参考文章: (1)java向数据库插入数据时的错误: Duplicate ent ...
- Duplicate entry...for key...
Duplicate entry...for key...的错误原因是主键的唯一值重复,在对数据库进行修改.插入操作时,一但主键的唯一值重复就会报此错误,有时在表中存在多个主键时,对表操作仍然报此错误, ...
- MySQL5.7创建唯一索引时报错提示Duplicate entry * for key *
一.报错原因 因表中创建唯一索引的列有重复数据,导致创建唯一索引时报错提示Duplicate entry * for key * 二.报错演示 例如lz用户表中用户名.邮箱和创建时间三列属性中存在相同 ...
- Duplicate entry ‘***‘ for key ‘UK_mjrobjw9m8n29ou6083ixjxmf‘
后台运行报错Duplicate entry '***' for key 'UK_mjrobjw9m8n29ou6083ixjxmf' 检查sql语句,看数据库里面唯一的字段,你在添加或者修改的时候重复
- Duplicate entry '??…???' for key 'cname' Query:
今天开发过程中,进行数据修改Update 时遇到了个问题Duplicate entry '??-???' for key 'cname' Query: 这报错是 代表数据表中 字段xxx中 已经的这个 ...
- java duplicate entry_java向数据库插入数据时的错误: Duplicate entry '' for key 'PRIMARY' 问题解决...
错误提示为:你插入的记录与数据表中原有记录的主键重复了(Duplicate).所以插入失败 mysql主键设置成auto_increment时,进行并发性能测试出现主键反复Duplicate entr ...
- mysql 出现错误 Duplicate entry for key PRIMARY 解决办法
原来是没有主键的,想增加一列为主键. mysql> desc t111; +-------+-------------+------+-----+---------+-------+ | Fie ...
- mysql slave duplicate entry_slave 报Duplicate entry for key
今天slave机器报如下错误 [ERROR] Slave SQL: Error 'Duplicate entry '7301' for key 'PRIMARY'' on query. Default ...
- Duplicate entry for key 'PRIMARY'
错误场景: 更新同事代码之后启动报错,代码中的bug 具体的堆栈信息: com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolatio ...
最新文章
- python必背内容-python必背函数
- 用js改变embed标签的src值
- 设计模式在C语言中的应用--读nginx源码
- qt 背景和控件布局_Qt控件背景图片设置总结
- LeetCode 1410. HTML 实体解析器(哈希map)
- windows installer没有正确安装_电脑还可以这样禁止软件自动安装,后悔知道得太晚...
- python基础到实践教程_Python从入门到实践案例教程(21世纪高等学校计算机教育实用规划教材)...
- 4-2 数据模型的生成
- 经典神经网络 -- SSD : 设计原理与pytorch实现
- 阿里HSF(服务框架)
- NIOS软核处理器入门实验
- ANSYS WORKBENCH基础学习之应力奇异及位移结果对比
- QGroundControl 提示 Power redundancy not met: 0 instead of 1
- Java并发编程-Volatile和Syncronized关键字
- 解析:为什么设计师选择mac电脑居多?
- 三星i865刷android,三星S11加持黑科技,16GB+骁龙865,手机流畅度超越电脑
- 境界的彼方_lduoj_bfs宽搜
- Spark学习痛点和路线图
- 人人商城快速购买显示售罄图标
- 金融基础概念--股票