You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SpringBoot 3.0迁移至Jakarta后Hibernate Sequence生成ID值异常

SpringBoot 3.0迁移至Jakarta后Hibernate Sequence生成ID值异常

嘿,我之前在升级Spring Boot 3的时候也碰到过这个坑,给你分享下可能的原因和解决办法:

  • 核心原因:Hibernate 6的序列生成逻辑变了
    Spring Boot 3默认搭配的是Hibernate 6,和之前的Hibernate 5相比,它对序列生成器的默认行为做了调整。比如默认的ID生成优化器、序列步长匹配规则都有变化,最常见的问题就是数据库序列的INCREMENT BY值和Hibernate配置的allocationSize不匹配,导致生成的ID和序列当前值不同步,出现你说的新对象ID比序列值小的情况。

  • 解决办法1:对齐数据库序列和实体类配置的步长
    先检查你的数据库中hibernate_sequence的增量值:

    SELECT sequence_name, increment_by FROM information_schema.sequences WHERE sequence_name = 'hibernate_sequence';
    

    然后确保实体类中@SequenceGenerator的allocationSize和这个值一致。比如如果数据库序列的INCREMENT BY是1,就把实体类的allocationSize设为1:

    @Entity
    public class YourEntity {
        @Id
        @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "entity_seq")
        @SequenceGenerator(
            name = "entity_seq",
            sequenceName = "hibernate_sequence",
            allocationSize = 1 // 和数据库序列的INCREMENT BY保持一致
        )
        private Long id;
        // 其他字段和方法
    }
    

    如果你想保留Hibernate的批量分配优化(提升性能),可以把数据库序列的增量改成Hibernate默认的50:

    ALTER SEQUENCE hibernate_sequence INCREMENT BY 50;
    
  • 解决办法2:显式指定序列生成器的优化器
    有时候即使步长一致,Hibernate 6的默认优化器也可能导致问题,你可以显式指定用pooled优化器,确保ID生成和序列增长同步:

    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "entity_seq")
    @SequenceGenerator(
        name = "entity_seq",
        sequenceName = "hibernate_sequence",
        allocationSize = 50,
        parameters = @Parameter(name = "optimizer", value = "pooled")
    )
    private Long id;
    
  • 解决办法3:临时回退到Hibernate 5的兼容模式
    如果你暂时不想调整序列或实体类配置,可以在配置文件里开启Hibernate的兼容模式,强制使用旧的生成逻辑:
    对于application.properties:

    spring.jpa.properties.hibernate.id.new_generator_mappings=false
    

    对于application.yml:

    spring:
      jpa:
        properties:
          hibernate:
            id:
              new_generator_mappings: false
    

    不过这个方法只是临时方案,不推荐长期使用,因为它会关闭Hibernate 6的新特性优化。

你可以先从第一个办法开始排查,步长不匹配是最常见的诱因,调整后应该就能解决问题啦~

备注:内容来源于stack exchange,提问作者Manikandan Thangapandiyan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.20 10:42:58