• Spring Data JPA审计


    Spring Data JPA为跟踪持久性层的变化提供了很好的支持。通过使用审核,我们可以存储或记录有关实体更改的信息,例如谁创建或更改了实体以及何时进行更改。

    我们可以利用实体字段上的@CreatedBy,@CreatedDate,@LastModifiedDate,@LastModifiedBy注释来指示 Spring JPA 透明地填充这些字段。我们可以按如下方式使用注释:

    1. @Entity
    2. public class Category {
    3. @Id
    4. @GeneratedValue(strategy = GenerationType.IDENTITY)
    5. private Long id;
    6. private Long title;
    7. @CreatedBy
    8. private Long createdBy;
    9. @CreatedDate
    10. private LocalDateTime createdDate;
    11. @LastModifiedBy
    12. private Long lastModifiedBy;
    13. @LastModifiedDate
    14. private LocalDateTime lastModifiedDate;
    15. // getters and setter..
    16. }

    大多数实体通常需要审计功能,因此创建和抽象包含审计字段的Auditable类并通过需要审计的实体扩展抽象类是一种更好的方法。通过这种方式,我们将避免在所有实体中重复相同的字段。

    创建抽象可审计类

    我们可以创建一个 Abstract 类来包含审计相关字段,如下所示:

    1. @MappedSuperclass
    2. @EntityListeners(AuditingEntityListener.class)
    3. public abstract class Auditable {
    4. @CreatedBy
    5. @Column(columnDefinition = "bigint default 1", updatable = false)
    6. protected Long createdBy;
    7. @CreatedDate
    8. @Column(columnDefinition = "timestamp default '2020-04-10 20:47:05.967394'", updatable = false)
    9. protected LocalDateTime createdDate;
    10. @LastModifiedBy
    11. @Column(columnDefinition = "bigint default 1")
    12. protected Long lastModifiedBy;
    13. @LastModifiedDate
    14. @Column(columnDefinition = "timestamp default '2020-04-10 20:47:05.967394'")
    15. protected LocalDateTime lastModifiedDate;
    16. public Long getCreatedBy() {
    17. return createdBy;
    18. }
    19. public void setCreatedBy(Long createdBy) {
    20. this.createdBy = createdBy;
    21. }
    22. public LocalDateTime getCreatedDate() {
    23. return createdDate;
    24. }
    25. public void setCreatedDate(LocalDateTime createdDate) {
    26. this.createdDate = createdDate;
    27. }
    28. public Long getLastModifiedBy() {
    29. return lastModifiedBy;
    30. }
    31. public void setLastModifiedBy(Long lastModifiedBy) {
    32. this.lastModifiedBy = lastModifiedBy;
    33. }
    34. public LocalDateTime getLastModifiedDate() {
    35. return lastModifiedDate;
    36. }
    37. public void setLastModifiedDate(LocalDateTime lastModifiedDate) {
    38. this.lastModifiedDate = lastModifiedDate;
    39. }
    40. }

    @MappedSuperclass注解用于指定类本身不是实体,但其属性可以采用与实体相同的方式映射,但是此映射仅适用于其子类。所以每个类继承抽象类Auditable将包含这些属性。

    @EntityListeners注释用于配置AuditingEntityListener其中包含方法@PrePersist和@PreUpdate,以便捕获审核信息​​​​​​​

    启用审核功能

    为了在 Spring 中启用审计功能,我们需要使用@EnableJpaAuditing注释。

    1. @SpringBootApplication
    2. @EnableJpaAuditing
    3. public class BackendApplication {
    4. public static void main(String[] args) {
    5. SpringApplication.run(BackendApplication.class, args);
    6. }
    7. }

    提供审计师

    createdDatelastModifiedDate字段根据当前时间填充。此外,createdBy​​​​​​​​​​​​​​和lastModifiedBy需要一种方法来获取正在执行操作的用户。为了提供这些信息,我们需要实现AuditorAware接口。​​​​​​​​​​​​​​

    1. @Component
    2. public class AuditAwareImpl implements AuditorAware {
    3. @Override
    4. public Optional getCurrentAuditor() {
    5. ApplicationUser principal = (ApplicationUser) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
    6. return Optional.of(principal.getId());
    7. }
    8. }

    我们添加了 getCurrentAuditor的实现,因为它被调用以检索正在执行操作的用户。

    扩展实体中的可审核类

    现在我们可以在要使用的实体中扩展类 Auditable审计.例如:

    1. @Entity
    2. @Data
    3. public class Category extends Auditable {
    4. @GeneratedValue(strategy = GenerationType.IDENTITY)
    5. @Id
    6. private Long id;
    7. private String title;
    8. // ..
    9. }

    审核字段将自动填充:

  • 相关阅读:
    [TUCTF 2022] 部分
    【LeetCode】57. 插入区间
    【java】【SpringBoot】【四】原理篇 bean、starter、核心原理
    TornadoFx设置保存功能((config和preference使用))
    Java面试题——继承,多态
    熔断、限流、降级 —— SpringCloud Alibaba Sentinel
    ASP.NET Core+Vue3 实现SignalR通讯
    武汉新时标文化传媒有限公司短视频创业是一个趋势
    [附源码]java毕业设计旅游景点推荐系统
    LeetCode Cookbook 数组习题(2)
  • 原文地址:https://blog.csdn.net/allway2/article/details/127971491