Spring Boot 2迁3时Spring Batch忽略_seq表主键值问题求助
问题分析
从Spring Boot 2迁移至Spring Boot 3(对应Spring Batch 4升级到5)后,出现主键生成冲突问题:
Currency实体通过@GeneratedValue注解生成主键id,MySQL中已存在currency业务表和存储序列值的currency_seq表(当前next_val为51)- 插入数据时系统无视
currency_seq的序列值,从1开始生成主键,触发ConstraintViolationException提示主键'1'重复 - 当前配置:
spring.jpa.hibernate.ddl-auto=updatespring.datasource.driver-class-name=com.mysql.cj.jdbc.Driverspring.batch.jdbc.initialize-schema=ALWAYS
解决方案
1. 显式指定Hibernate序列生成策略
Spring Boot 3默认搭配Hibernate 6,其对MySQL序列生成的处理逻辑有变更。需显式绑定现有序列表,避免默认策略偏差:
@Id @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "currency_seq") @SequenceGenerator(name = "currency_seq", sequenceName = "currency_seq", allocationSize = 1) private Long id;
注意allocationSize=1需与序列表的步长保持一致,防止Hibernate缓存序列值导致不匹配。
2. 调整Spring Batch初始化策略
spring.batch.jdbc.initialize-schema=ALWAYS会在每次启动时初始化Spring Batch元数据表,可能干扰自定义序列表的读取。建议修改为:
spring.batch.jdbc.initialize-schema=IF_NOT_EXISTS
仅在元数据表不存在时执行初始化,避免重复操作影响业务序列。
3. 手动同步序列起始值
若Hibernate仍未读取到currency_seq的正确值,可执行SQL手动同步序列起始值,确保其大于currency表的最大主键:
UPDATE currency_seq SET next_val = (SELECT MAX(id) + 1 FROM currency);
执行完成后重启应用,让Hibernate读取正确的序列起始值。
4. 配置Hibernate适配MySQL序列模拟
在配置文件中添加以下参数,强制Hibernate 6使用表模拟序列的逻辑:
spring.jpa.hibernate.generator.stored-procedure.use-get-generated-keys=false spring.jpa.hibernate.use-new-id-generator-mappings=true
内容的提问来源于stack exchange,提问作者Samuel
相关产品推荐
相关产品推荐

