如何将Hibernate Envers主键DDL还原为Hibernate 5的行为?
解决Hibernate 6 Envers审计表主键顺序变更问题
核心配置方案
要还原Hibernate 5中审计表主键id, rev的顺序,只需添加以下Hibernate配置:
hibernate.envers.audit_table_primary_key_order=ENTITY_ID_FIRST
若使用persistence.xml,配置如下:
<property name="hibernate.envers.audit_table_primary_key_order" value="ENTITY_ID_FIRST"/>
问题背景说明
Hibernate 6对Envers审计表的主键顺序做了默认调整:
- Hibernate 5及更早版本:审计表主键顺序为实体ID字段在前,修订版本号(rev)在后(如
id, rev) - Hibernate 6默认:主键顺序变为修订版本号在前,实体ID字段在后(如
rev, id)
这一变更会导致Liquibase生成大量删除并重建主键的迁移脚本,而由于审计表可能被外键引用,这类脚本往往无法直接执行,手动修复成本极高。
配置验证
添加上述配置后,重新生成的Liquibase脚本将恢复为Hibernate 5的格式:
示例实体代码
@Entity @Audited public class MyEntity { @Id private Long id; private String name; }
恢复后的Liquibase变更集
<changeSet author="snussbaumer (generated)" id="1693555682159-2"> <createTable tableName="my_entity_aud"> <column name="id" type="BIGINT"> <constraints nullable="false" primaryKey="true" primaryKeyName="my_entity_audPK" /> </column> <column name="rev" type="INT"> <constraints nullable="false" primaryKey="true" primaryKeyName="my_entity_audPK" /> </column> <column name="revtype" type="TINYINT" /> <column name="name" type="VARCHAR(255)" /> </createTable> </changeSet>
内容的提问来源于stack exchange,提问作者Sébastien Nussbaumer
相关产品推荐
相关产品推荐

