工作中遇到一个需求:需要保存对象的历史版本记录,保证该对象的版本可以回溯审计。
解决方案:这个项目使用Hibernate,可以使用其本身组件Hibernate-Envers。它可以使用一个@Audited注解在实体类上,就可以自动生成一个类名_aud的从表,将增删改操作记录保存其中。
官网介绍:Envers
https://hibernate.org/orm/envers/
入门指南: https://docs.jboss.org/hibernate/orm/current/quickstart/html_single/#tutorial_envers
使用文档:https://docs.jboss.org/hibernate/orm/current/userguide/html_single/Hibernate_User_Guide.html#envers
Hibernate-Envers可以实现对数据变更进行自动的审计记录。
基本原理:就是为每个Audited的对象数据表创建一个对应_AUD结尾的审计数据存储表,然后借助Hibernate Listener机制把对数据的增删改操作涉及的快照数据记录搬迁到_AUD审计数据表。 因此审计数据表根据业务操作的频率可能增长会很快,可以考虑一些分库分区等优化措施来减少对业务数据存取效率的影响,启用此功能之前建议仔细阅读官方文档说明及考虑一定的调优措施。
引用自一个中文Demo

使用:
- 先保证你的项目里有基本的配置,比如Hibernate及其他已经配置好。
- 引入依赖
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-envers</artifactId>
<version>5.4.0.Final</version>
</dependency>
- 在要保存的实体类中加个注解,比如:
@Entity
@Audited
public class Person {
@Id
@GeneratedValue
private Integer id;
private String name;
private String surname;
}
- 这样就可以了,有增删改会自动记录。
- 在自动生成的Person_aud的表中,会记录id、版本id、增删改查操作对应的操作码0或者1或者2、name、surname。
- 如果涉及各种关系形式(多对一,多对多等)的审计实体,需要自行配置,建议查看上述文档即可。
说点什么