使用 @Audited 增强Spring Boot 应用程序的数据审计能力

介绍

在Spring Boot开发的动态世界中,确保数据完整性和跟踪变化是至关重要的。实现这一目标的一个强大工具是@Audited注解。本文深入探讨了该注解的复杂性、其目的、实现步骤以及如何利用其功能进行有效的实体审计。

理解@Audited

Spring Boot中的@Audited注解用于审计实体,提供对数据随时间变化的详细记录。这在需要跟踪修改、用户操作或合规要求的情况下非常有价值。

实现步骤

  1. 依赖项:要包含@Audited,需要在项目中添加spring-data-envers依赖。确保你的pom.xml或build.gradle反映这一添加。
xml 复制代码
<!-- Maven Dependency -->
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
  <groupId>org.hibernate</groupId>
  <artifactId>hibernate-envers</artifactId>
</dependency>

spring-boot-starter-data-jpa依赖包含了使用Spring Data JPA进行数据访问所需的组件。然而,如果你特别想在Spring Boot中使用@Audited注解启用实体审计,还需要包含hibernate-envers依赖。该依赖添加了对Hibernate Envers的支持,这是负责实体版本控制和审计的工具。

  1. 实体配置:将@Audited注解应用于你想要审计的实体类。
java 复制代码
import org.hibernate.envers.Audited;
@Entity
@Audited
public class YourEntity {
  // 你的实体字段和方法
}
  1. application.yml配置:确保你的application.yml或application.properties包含Hibernate Envers所需的配置。
yaml 复制代码
spring:
   data:
      jpa:
        repositories:
            enabled: true
        auditing:
            enabled: true
  1. 审计表字段:Hibernate Envers生成的审计表通常包括REV(修订号)、REVTYPE(修订类型)、AUDIT_TIMESTAMP(审计时间戳)等字段。这些字段共同存储对审计实体的历史更改。

Spring Boot会自动创建审计表(例如,'YourEntity_AUD')以存储元数据。

探索审计表中的字段:

-- REV:修订号(递增)

-- REVTYPE:修订类型(插入、更新、删除)

-- AUDITEDFIELD:审计字段值

-- MODIFIEDBY:进行更改的用户

-- MODIFIEDDATE:修改日期和时间

  1. 检索审计数据:使用Spring Data JPA仓库查询审计历史。
java 复制代码
import org.springframework.data.repository.history.RevisionRepository;
import org.springframework.data.history.Revision;
import java.util.List;
public interface YourEntityAuditRepository extends RevisionRepository<YourEntity, Long, Integer> {
    List<Revision<Integer, YourEntity>> findRevisionsById(Long entityId);
}

在这个例子中:

-- YourEntityAuditRepository扩展了RevisionRepository,这是一个处理修订的Spring Data JPA接口。

-- findRevisionsById方法允许你检索具有指定ID的实体的所有修订。

然后,你可以在服务或控制器中使用此仓库查询审计历史:

java 复制代码
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class AuditService {
    
    private final YourEntityAuditRepository entityAuditRepository;
    @Autowired
    public AuditService(YourEntityAuditRepository entityAuditRepository) {
        this.entityAuditRepository = entityAuditRepository;
    }
    public List<Revision<Integer, YourEntity>> getEntityRevisions(Long entityId) {
        return entityAuditRepository.findRevisionsById(entityId);
    }
}

另一个例子

使用Hibernate Envers查询具有给定ID的特定实体的审计历史

java 复制代码
List<YourEntity_AUD> revisions = auditReader.findRevisions(YourEntity.class, entityld);

-- auditReader:一个AuditReader实例,由Hibernate Envers提供。它允许你与实体的审计历史进行交互。

-- findRevisions:Hibernate Envers提供的方法,用于检索具有指定ID的给定实体的所有修订。

-- YourEntity.class:你想要检索审计历史的实体类。

-- entityId:你想要获取修订的实体的特定ID。

-- List<YourEntity_AUD>:结果是一个审计实体(YourEntity_AUD)的列表,列表中的每个条目代表实体的一个修订。

在Hibernate Envers中,当你为一个实体启用审计时,它会生成一个带有"_AUD"后缀的相应审计实体(默认情况下)。这个审计实体会跟踪原始实体随时间变化的所有更改。

因此,这行代码本质上是在查询具有给定ID的实体的所有修订的审计历史,并将结果存储在一个审计实体列表中。然后,可以使用此列表分析或显示实体在不同修订中的更改。

欢迎关注我的公众号:程序猿DD。第一时间了解前沿行业消息、分享深度技术干货、获取优质学习资源