如何配置Hibernate Envers仅审计抽象基类AbstractDict并避免为子类生成独立审计表
如何配置Hibernate Envers仅审计抽象基类AbstractDict并避免为子类生成独立审计表
我之前在维护多子类继承的实体审计时,遇到过完全一样的问题——50+子类每个都加@Audited不仅繁琐,还会导致审计表爆炸。结合Envers的继承审计规则,给你两个精准的解决方案,适配不同场景:
场景1:子类无额外需审计的持久化字段(你的当前场景)
如果你的子类像示例中的DocumentTypes一样,没有新增需要审计的数据库字段,只是继承基类的逻辑,那么只需要两步就能解决:
步骤1:保留基类的审计配置,移除所有子类的@Audited和@AuditTable
保持AbstractDict上的注解不变:
@Audited @AuditTable(schema = "audit", value = "abstract_dict_aud") @Entity @Table(name = "abstract_dict", schema = "dictionaries") @Inheritance(strategy = InheritanceType.JOINED) // 其他原有注解... public abstract class AbstractDict extends AbstractAuditingEntity implements Serializable { // ... 基类字段 }
删除所有子类的@Audited和@AuditTable注解,比如DocumentTypes只需要保留基础实体注解:
@Entity @Table(name = "document_types", schema = "dictionaries") @Getter @Setter public class DocumentTypes extends AbstractDict implements Serializable { @Override protected AbstractDict createNewWithExtendedFields() { return new DocumentTypes(); } }
步骤2:开启Envers的父类审计继承配置
在你的配置文件中添加Envers全局配置,让子类自动继承父类的审计规则:
- 如果是Spring Boot项目,在
application.yml中添加:
spring: jpa: properties: org: hibernate: envers: audit_parents: true
- 如果是传统Hibernate配置,在
hibernate.cfg.xml中添加:
<property name="org.hibernate.envers.audit_parents">true</property>
这个配置的核心作用是:当子类未显式标注@Audited时,自动审计其已被@Audited标注的父类字段,所有子类的变更记录都会统一写入基类的abstract_dict_aud表,不会生成任何子类专属的审计表,也不需要手动维护外键约束。
场景2:子类有额外需审计的持久化字段
如果后续子类新增了需要审计的字段,你可以通过@AuditOverride将子类字段的审计记录也合并到基类的审计表中:
@Entity @Table(name = "document_types", schema = "dictionaries") @Getter @Setter @AuditOverride(forClass = AbstractDict.class) // 继承基类审计配置 @AuditTable(schema = "audit", value = "abstract_dict_aud") // 指定使用基类的审计表 public class DocumentTypes extends AbstractDict implements Serializable { @Column(name = "extra_field") private String extraField; // 子类新增的需审计字段 @Override protected AbstractDict createNewWithExtendedFields() { return new DocumentTypes(); } }
这样,子类的extraField变更也会被审计到abstract_dict_aud表中(需要确保该表已提前添加对应字段,或让Hibernate自动更新表结构)。
验证方案
完成配置后,你可以:
- 修改任意子类实体的基类字段(比如
AbstractDict中的名称、状态等) - 查看
audit.abstract_dict_aud表,确认是否生成了对应的审计记录 - 检查数据库中是否没有生成子类的
xxx_aud表
这个方案完全符合你的需求:既不需要给50+子类逐个加注解,也能统一审计所有基类字段的变更,避免了大量的审计表和手动外键维护。
内容来源于stack exchange
相关产品推荐
相关产品推荐

