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
相关产品推荐
相关产品推荐

