【问题标题】:HibernateEnvers custom column nameHibernateEnvers 自定义列名
【发布时间】:2025-12-21 21:21:02
【问题描述】:

我正在我正在处理的项目中实现 Hibernate Envers,对于这个客户,数据库中的表和列必须遵循特定的名称模式。名称模式使用表名生成部分列名,保存修订的表与原始表具有不同的名称(当然),因此我需要能够更改生成的表的列名恩弗斯。

如何更改实体试听表的列名?

  • 我使用的是休眠 4.3.11-FINAL
  • 更改修订表 (REVINFO) 名称和列以及实体的试听表名称都没有问题

【问题讨论】:

  • Alexandru 是正确的,目前无法自定义列名,因为使用的命名已被烘焙到从逻辑源表读取的元数据中。我添加了一个新的 JIRA 问题 hibernate.atlassian.net/browse/HHH-10941。如果这是真正有用的东西,请随意添加投票。
  • 感谢@Naros,刚刚投票 =)
  • 好吧,由于 hibernate 支持属性上的@Column 注释,我希望在“@Audit”注释中有类似“@AuditColumn”或参数“columName”的东西
  • modifiedColumnName 有一个属性,但这仅在全局启用或在每个审核属性上启用修改属性功能时使用。我可以看看是否有时间在 6.x 发布周期中引入这个,但一如既往地欢迎拉取请求:)。
  • 作为 Envers 代码库的维护者之一,目前无法更改列名,也没有解决方法。这就是我添加 HHH-10941 的原因。欢迎您针对该问题提交拉取请求,如果它很重要,则添加此功能。

标签: hibernate hibernate-envers


【解决方案1】:

我不认为 Envers 提供此功能(更改列名),我希望我错了。

我能想到的两个选择是:

  • 深入了解 Envers 代码并尝试了解如何自定义审计中数据的写入方式,我正在考虑列标识部分
  • 改变审计的工作方式,例如采用一种可以使用触发器的方法

【讨论】:

    【解决方案2】:

    REVINFO 是默认 RevisionListener 的默认表

    您需要创建实现 RevisionListener 的自定义修订监听器 和你的自定义 revsionEntity。

    自定义实体监听器:

    public class CustomRevisionEntityListener implements RevisionListener {
    
    @Override
    public void newRevision(Object revisionEntity) {
        CustomRevisionEntity revision = (CustomRevisionEntity) revisionEntity;
        revision.setIPAddress("UserIPAddress");
    }
    }
    

    而自定义实体,你可以使用任何表名和任何字段:

    @Entity
    @Table(name="anyTableName")
    @RevisionEntity(CustomRevisionEntityListener.class)
    @Setter
    @Getter
    @EqualsAndHashCode
    public class CustomRevisionEntity implements Serializable {
    
        @Id
        @GeneratedValue
        @RevisionNumber
        @Column(name = "rev")
        private int id;
    
        @RevisionTimestamp
        @Column( name = "revtstmp")
        private long timestamp;
    
    
        @Column(name = "ipAddress")
        private String IPAddress ; 
    
    }
    

    【讨论】:

    • 嗨@Vivek,您的回答只解决了更改 REVINFO 表的问题,但这不是我想要的...... REVINFO 表不是“试镜表”,它只是保存修订信息
    最近更新 更多