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

如何将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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 18:15:02