Spring Boot JPA项目插入数据时出现唯一索引/主键冲突求排查方案
针对你遇到的org.h2.jdbc.JdbcSQLIntegrityConstraintViolationException主键约束冲突错误,按以下步骤排查:
检查数据库表结构
执行H2控制台SQL命令查看表结构:show create table cr_book_dtl;重点确认
BOOK_ID字段是否配置了自增(AUTO_INCREMENT)。如果是自增主键,手动指定0或NULL可能触发冲突——H2对自增字段传入0时,会尝试直接使用该值而非生成自增序列,若表中已存在BOOK_ID=0的记录就会报错。核对JPA实体类映射
检查实体类中BOOK_ID字段的注解配置:@Id @GeneratedValue(strategy = GenerationType.IDENTITY) // 适配H2的自增策略 private Long bookId;如果没有添加
@GeneratedValue或策略错误(比如用了SEQUENCE但未配置对应序列),插入时必须手动传入唯一的BOOK_ID值,若重复传入0就会触发约束冲突。排查插入数据的赋值逻辑
检查业务代码中BOOK_ID的生成/赋值逻辑:- 是否存在前端未传值时,后端默认将
BOOK_ID设为0的情况? - 若使用自定义主键生成工具(如雪花算法),是否出现了重复值?
- 是否存在前端未传值时,后端默认将
检查表中已有数据
执行SQL查询确认是否存在冲突的主键记录:select * from cr_book_dtl where book_id = 0;如果查询到结果,说明已有
BOOK_ID=0的记录,再次插入相同值必然触发约束错误。验证主键生成策略的兼容性
若使用GenerationType.AUTO策略,H2默认会选择IDENTITY,但部分场景下可能因配置问题失效。可以显式指定IDENTITY策略,确保H2自动生成主键值,避免手动传入重复值。排查批量插入或事务异常
如果是批量插入操作,检查是否存在重复生成BOOK_ID的情况;若之前有事务回滚,确认H2的自增序列是否因回滚未重置(H2默认回滚后自增序列不会回退,可能导致后续插入时主键值跳跃,但不会直接触发重复,需结合实际场景判断)。
内容的提问来源于stack exchange,提问作者Jitendra Kushwaha

