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

cnblogs 2024-07-25 10:39:00 阅读 93

介绍

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

理解@Audited

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

实现步骤

1. 依赖项:要包含@Audited,需要在项目中添加spring-data-envers依赖。确保你的pom.xml或build.gradle反映这一添加。

<code><!-- 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的支持,这是负责实体版本控制和审计的工具。

2. 实体配置:将@Audited注解应用于你想要审计的实体类。

import org.hibernate.envers.Audited;

@Entity

@Audited

public class YourEntity {

// 你的实体字段和方法

}

3. application.yml配置:确保你的application.yml或application.properties包含Hibernate Envers所需的配置。

spring:

data:

jpa:

repositories:

enabled: true

auditing:

enabled: true

4. 审计表字段:Hibernate Envers生成的审计表通常包括REV(修订号)、REVTYPE(修订类型)、AUDIT_TIMESTAMP(审计时间戳)等字段。这些字段共同存储对审计实体的历史更改。

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

探索审计表中的字段:

– REV:修订号(递增)

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

– AUDITEDFIELD:审计字段值

– MODIFIEDBY:进行更改的用户

– MODIFIEDDATE:修改日期和时间

5. 检索审计数据:使用Spring Data JPA仓库查询审计历史。

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的实体的所有修订。

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

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的特定实体的审计历史

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。第一时间了解前沿行业消息、分享深度技术干货、获取优质学习资源



声明

本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。