使用 @Audited 增強Spring Boot 應用程式的資料審計能力

程序猿DD發表於2024-07-25

介紹

在Spring Boot開發的動態世界中,確保資料完整性和跟蹤變化是至關重要的。實現這一目標的一個強大工具是@Audited註解。本文深入探討了該註解的複雜性、其目的、實現步驟以及如何利用其功能進行有效的實體審計。

理解@Audited

Spring Boot中的@Audited註解用於審計實體,提供對資料隨時間變化的詳細記錄。這在需要跟蹤修改、使用者操作或合規要求的情況下非常有價值。

實現步驟

1. 依賴項:要包含@Audited,需要在專案中新增spring-data-envers依賴。確保你的pom.xml或build.gradle反映這一新增。

<!-- 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。第一時間瞭解前沿行業訊息、分享深度技術乾貨、獲取優質學習資源

相關文章