SpringBoot3+Hibernate Envers6升级后缺失revinfo_seq序列报错求助
解决Envers 6.1.6.Final启动报错"revinfo_seq不存在"的问题
问题原因
Hibernate Envers 6.0+ 对默认的RevisionEntity ID生成策略做了变更:从TABLE表生成器改为SEQUENCE序列生成器,以提升性能。你的旧版本(5.6.8)依赖TABLE生成器,不需要序列就能运行;但升级到6.x后,默认会尝试使用revinfo_seq序列生成revision值,而你的数据库中没有这个序列,也没有显式指定其他生成策略,因此报错。
解决方案
根据你的需求,有三种可行方案:
方案1:继续使用TABLE生成器(和旧版本逻辑一致)
在自定义的RevisionEntity类中,显式指定ID使用TABLE生成器,替代默认的SEQUENCE策略:
@Entity @Table(name = "revinfo") public class CustomRevisionEntity extends DefaultRevisionEntity { // 你的自定义字段:client_id、correlation_id等 @Id @GeneratedValue(strategy = GenerationType.TABLE, generator = "revision_table_generator") @TableGenerator( name = "revision_table_generator", table = "hibernate_envers_rev_seq", // Envers 5.x默认的生成器表名 pkColumnName = "sequence_name", valueColumnName = "next_val", pkColumnValue = "revinfo", initialValue = 1, allocationSize = 1 ) @Column(name = "revision") private long id; // 省略getter、setter }
配置后,Envers会通过表存储自增数值,不再依赖序列。
方案2:切换到SEQUENCE生成器(推荐,性能更优)
步骤1:创建序列
可以手动在PostgreSQL中创建序列:
CREATE SEQUENCE revinfo_seq START WITH 1 INCREMENT BY 1;
或者确保spring.jpa.hibernate.ddl-auto:create配置生效,Hibernate会自动生成该序列。
步骤2:在自定义RevisionEntity中指定SEQUENCE策略
@Entity @Table(name = "revinfo") public class CustomRevisionEntity extends DefaultRevisionEntity { // 你的自定义字段 @Id @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "revinfo_seq_generator") @SequenceGenerator( name = "revinfo_seq_generator", sequenceName = "revinfo_seq", initialValue = 1, allocationSize = 1 ) @Column(name = "revision") private long id; // 省略getter、setter }
方案3:使用IDENTITY原生生成策略
步骤1:修改revinfo表结构
将revision列改为PostgreSQL的IDENTITY自增列:
ALTER TABLE revinfo ALTER COLUMN revision ADD GENERATED ALWAYS AS IDENTITY;
步骤2:启用Envers原生ID配置
在application.properties/application.yml中添加:
org.hibernate.envers.use_revision_entity_with_native_id=true
此配置会让Envers使用数据库原生的自增机制,无需序列或额外表。
内容的提问来源于stack exchange,提问作者vfluegel
相关产品推荐
相关产品推荐

