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

Spring Boot 2.0迁移后Hibernate Envers 5.2.14生成无用hibernate_sequence表

解决Spring Boot 2.0迁移后Hibernate Envers生成无用hibernate_sequence表的问题

我升级Spring Boot到2.0的时候也踩过这个坑,结合Hibernate Envers确实会冒出这个莫名其妙的hibernate_sequence表,其实根源是Hibernate版本升级后的主键生成策略变化导致的。

问题原因

Spring Boot 2.0对应的Hibernate版本是5.2+,GenerationType.AUTO的默认行为和1.5.x时期不一样了:

  • 在1.5.x里,AUTO配合native生成器会自动适配数据库的自增主键(比如MySQL的AUTO_INCREMENT)
  • 但Hibernate 5+之后,AUTO会优先尝试使用序列生成主键,哪怕你指定了native生成器,它还是会生成hibernate_sequence表来兜底,而你的RevInfo用的是自增ID,所以这个表完全是多余的。

具体解决方案

方案1:直接修改RevInfo的主键生成策略(推荐)

把@GeneratedValue的策略明确改成GenerationType.IDENTITY,这个策略专门对应数据库的自增主键机制,Hibernate会直接使用数据库的自增功能,不会再生成序列表。修改后的代码如下:

@Entity
@RevisionEntity(RevInfoListener.class)
public class RevInfo {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;
    
    // 你的其他字段、构造方法、getter/setter...
}

方案2:调整Hibernate的全局配置(兼容旧代码)

如果不想修改实体类代码,可以在Spring Boot的配置文件里关闭新的ID生成映射,强制Hibernate沿用旧的native生成器行为:

application.properties:

spring.jpa.hibernate.use-new-id-generator-mappings=false

application.yml:

spring:
  jpa:
    hibernate:
      use-new-id-generator-mappings: false

不过要注意,这个配置在Hibernate 5.4+之后已经被标记为废弃,长远来看还是推荐用方案1。

额外注意事项

  • 修改完成后,记得手动删除已经生成的hibernate_sequence表
  • 检查项目中其他实体类,如果有用GenerationType.AUTO的自增主键,最好也统一改成IDENTITY,避免再次生成无用的序列表

这样调整之后,Envers的版本信息依然会正常存储在你的自定义RevInfo表里,不会再生成多余的hibernate_sequence了。

内容的提问来源于stack exchange,提问作者drenda

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 07:36:04