如何在Hibernate Envers中手动补全删除修订对应审计表的缺失字段?
关于Hibernate Envers删除审计记录补全的解决方案
能否直接通过Hibernate Envers API更新审计记录
Hibernate Envers本身没有提供官方API来直接修改已生成的审计记录,Envers的设计定位是只读的审计日志层,所有审计记录的生成都由框架在业务操作执行时自动触发,不支持后续通过Envers原生接口修改审计表数据。
可行的补全方案
你可以通过原生SQL/ORM直接操作审计表完成数据补全,操作逻辑如下:
- 先定位所有已删除数据对应的最后一次有效审计记录(即删除操作之前最近的ADD/MOD类型审计记录),这条记录存储了删除前的全量字段数据
- 编写更新语句,将删除类型审计记录(Envers中删除操作的
revtype固定为2)的空白字段,用上述有效记录的对应字段值覆盖
以你提到的employee表为例,对应审计表默认命名为employee_aud,参考MySQL语法的更新语句如下:
UPDATE employee_aud del_aud INNER JOIN ( SELECT id, name, age, address, MAX(rev) as last_valid_rev FROM employee_aud WHERE revtype IN (0,1) -- 0对应ADD操作,1对应MOD操作 GROUP BY id ) valid_aud ON del_aud.id = valid_aud.id SET del_aud.name = valid_aud.name, del_aud.age = valid_aud.age, del_aud.address = valid_aud.address WHERE del_aud.revtype = 2 AND del_aud.name IS NULL;
后续配置修复建议
补全完历史数据后,在配置文件中添加以下配置,保证后续删除操作的审计记录自动留存全量数据:spring.jpa.properties.org.hibernate.envers.store_data_at_delete=true
内容的提问来源于stack exchange,提问作者Gopinath
相关产品推荐
相关产品推荐

