Hibernate自增主键因重复导致报错“Duplicate entry 'xxx' for key 'PRIMARY'”
来源:互联网 发布:美折促销软件 编辑:程序博客网 时间:2024/05/22 13:06
最近项目中的日志文件总是能看到像下面这样的报错信息:
2017-12-13 13:33:31,427 ERROR [org.hibernate.engine.jdbc.spi.SqlExceptionHelper] (Thread-10:) Duplicate entry '1153' for key 'PRIMARY'
最初因为找不到引起改问题的原因,又没法重现,再加上对项目运行没影响,就没去关注。
但今天同样的问题引起业务流程跑不下去了,而且能够成功复现出来,所以得下决心解决了。
问题复现的场景是:多个人对同一张表同时执行插入操作,也就是并发操作。
按理说,主键是在数据库中设置的自增,应该不会因为并发操作导致主键冲突,所以怀疑是Hibernate框架导致的。
主键配置如下:
@Id@GeneratedValue(generator = "system-uuid") @GenericGenerator(name = "system-uuid", strategy = "increment")@Column(name = "ID", nullable = false)private Long id;
初步推断是Hibernate框架在插入数据库之前就生成好了主键,即主键由Hibernate产生,而非数据库产生。于是上网去搜Hibernate主键生成策略相关的文章,找到下面这段描述:
increment:代理主键,适合于所有数据库,由hibernate维护主键自增,和底层数据库无关,但是不适合于2个或以上hibernate进程。
identity:代理主键,适合于Mysql或ms sql server等支持自增的dbms,主键值不由hibernate维护。
sequence:代理主键,适合于oracle等支持序列的dbms,主键值不由hibernate维护,由序列产生。
native:代理主键,根据底层数据库的具体特性选择适合的主键生成策略,如果是mysql或sqlserver,选择identity,如果是oracle,选择sequence。
hilo:代理主键,hibernate把特定表的字段作为hign值,生成主键值
uuid.hex:代理主键,hibernate采用uuid 128位算法生成基于字符串的主键值
assign:适合于应用程序维护的自然主键。
项目中用到的是“increment”,证明之前的推断是正确的,因为项目用的数据库是MySQL,于是换用“identity”,即:
@Id@GeneratedValue(generator = "system-uuid") @GenericGenerator(name = "system-uuid", strategy = "identity")@Column(name = "ID", nullable = false)private Long id;
问题成功解决!
参考文章:
http://www.cnblogs.com/flyoung2008/articles/2165759.html
- Hibernate自增主键因重复导致报错“Duplicate entry 'xxx' for key 'PRIMARY'”
- 设置navicat数据库主键自增 1062报错以及result in duplicate entry '' for key 'primary'
- mysql 主键重复问题解决 Duplicate entry '787192513' for key 'PRIMARY'
- mysql主键设置成auto_increment时,进行并发性能测试出现主键重复Duplicate entry 'xxx' for key 'PRIMARY'
- Duplicate entry 'XXX' for key 'PRIMARY'
- mysql报错:Duplicate entry ‘1’ for key ‘PRIMARY’
- 【报错】Duplicate entry '0' for key 'PRIMARY'
- 报错 1062:Duplicate entry '4294967295' for key 'PRIMARY'
- Hibernate向数据库中添加数据报错Duplicate entry '0' for key 'PRIMARY'
- MySQL中出现Duplicate entry 'XXX' for key 'PRIMARY'解决方案
- mysql InnoDB表插入操作报duplicate entry for primary 却查询不到重复的主键
- Duplicate entry '##' for key 'PRIMARY'
- web开发——报错:Duplicate entry '...' for key 'PRIMARY
- mysql 主键自增 但是报主键重复的异常问题探究- Duplicate entry
- Duplicate entry '5' for key 'PRIMARY'
- Duplicate entry '0' for key 'PRIMARY'.
- Duplicate entry '20120323' for key 'PRIMARY'
- Duplicate entry '222' for key 'PRIMARY'
- Android 开发的技术方向
- ubuntu16.04配置ftp和传送文件的方式
- 2017.12.13日记
- SPSS R插件及PS Matching插件最详细简洁的安装经验
- Laravel学习日记2:路由
- Hibernate自增主键因重复导致报错“Duplicate entry 'xxx' for key 'PRIMARY'”
- 如何访问发布的webservice,并解析返回的非正常soap报文
- jstack简单使用,定位死循环、线程阻塞、死锁等问题
- android:一行代码实现沉浸式布局效果
- 清空缓存
- linux把home多余的空间转到root中
- U盘安装Linux系统
- openlayer 简单实用
- Python 字符串格式化