下面我来详细讲解Spring Data JPA的Audit功能审计数据库的变更的完整攻略。
什么是Spring Data JPA的Audit功能
Spring Data JPA的Audit功能是指将数据的变更操作记录下来,包括数据的新增、删除、修改等操作。通过Audit功能,我们可以了解数据的变更历史,并且可以追溯数据的操作者、操作时间等信息。
如何使用Spring Data JPA的Audit功能
使用Spring Data JPA的Audit功能,需要以下几个步骤:
- 配置JPA的实现方式,这里以Hibernate为例,在pom.xml中添加相关依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-envers</artifactId>
</dependency>
- 开启Hibernate的Envers功能,在application.yml中添加配置:
spring:
jpa:
hibernate:
ddl-auto: create
properties:
hibernate:
dialect: org.hibernate.dialect.MySQL5InnoDBDialect
envers:
audit_table_suffix: _history
store_data_at_delete: true
envers.audit_table_suffix
:指定审计表的后缀,默认为_AUD
,可以修改为_HISTORY
等。-
envers.store_data_at_delete
:指定是否在删除数据的时候记录数据,如果设置为true,则删除数据时,该数据的各个版本信息会被记录下来。 -
创建实体类,并添加
@Audited
注解:
@Entity
@Table(name = "user")
@Audited
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = "username")
private String username;
@Column(name = "password")
private String password;
@Column(name = "age")
private Integer age;
// getters and setters
}
-
在实体类上添加
@Audited
注解,表示该实体类开启审计功能。 -
获取审计历史记录:
@Test
public void getAuditHistory() {
AuditReader auditReader = AuditReaderFactory.get(entityManager);
List<Number> revisions = auditReader.getRevisions(User.class, 1L);
for (Number revision : revisions) {
User user = auditReader.find(User.class, 1L, revision);
System.out.println(String.format("version: %s, username: %s, password: %s, age: %s",
revision, user.getUsername(), user.getPassword(), user.getAge()));
}
}
AuditReader
是Envers提供的API,用于获取审计历史记录。auditReader.getRevisions(User.class, 1L)
:获取指定实体的审计历史记录版本号列表。auditReader.find(User.class, 1L, revision)
:获取指定版本号的实体对象。
示例
下面以添加用户和修改用户为例,演示Spring Data JPA的Audit功能。
添加用户示例:
@Test
public void addUser() {
User user = new User();
user.setUsername("zhangsan");
user.setPassword("123456");
user.setAge(18);
entityManager.persist(user);
}
添加用户后,我们可以查询该用户的审计历史记录:
@Test
public void getAuditHistory() {
AuditReader auditReader = AuditReaderFactory.get(entityManager);
List<Number> revisions = auditReader.getRevisions(User.class, 1L);
for (Number revision : revisions) {
User user = auditReader.find(User.class, 1L, revision);
System.out.println(String.format("version: %s, username: %s, password: %s, age: %s",
revision, user.getUsername(), user.getPassword(), user.getAge()));
}
}
输出结果为:
version: 1, username: zhangsan, password: 123456, age: 18
修改用户示例:
修改用户时,我们需要使用@Transactional
注解,使得修改操作在同一个事务中。
@Test
@Transactional
public void updateUser() {
User user = entityManager.find(User.class, 1L);
user.setPassword("654321");
entityManager.merge(user);
}
修改用户后,我们可以查询该用户的审计历史记录:
@Test
public void getAuditHistory() {
AuditReader auditReader = AuditReaderFactory.get(entityManager);
List<Number> revisions = auditReader.getRevisions(User.class, 1L);
for (Number revision : revisions) {
User user = auditReader.find(User.class, 1L, revision);
System.out.println(String.format("version: %s, username: %s, password: %s, age: %s",
revision, user.getUsername(), user.getPassword(), user.getAge()));
}
}
输出结果为:
version: 1, username: zhangsan, password: 123456, age: 18
version: 2, username: zhangsan, password: 654321, age: 18
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Spring Data JPA的Audit功能审计数据库的变更 - Python技术站