Spring Data JPA为跟踪持久性层的变化提供了很好的支持。通过使用审核,我们可以存储或记录有关实体更改的信息,例如谁创建或更改了实体以及何时进行更改。
我们可以利用实体字段上的@CreatedBy,@CreatedDate,@LastModifiedDate,@LastModifiedBy注释来指示 Spring JPA 透明地填充这些字段。我们可以按如下方式使用注释:
- @Entity
- public class Category {
- @Id
- @GeneratedValue(strategy = GenerationType.IDENTITY)
- private Long id;
- private Long title;
-
- @CreatedBy
- private Long createdBy;
-
- @CreatedDate
- private LocalDateTime createdDate;
-
- @LastModifiedBy
- private Long lastModifiedBy;
-
- @LastModifiedDate
- private LocalDateTime lastModifiedDate;
-
- // getters and setter..
- }
大多数实体通常需要审计功能,因此创建和抽象包含审计字段的Auditable类并通过需要审计的实体扩展抽象类是一种更好的方法。通过这种方式,我们将避免在所有实体中重复相同的字段。
我们可以创建一个 Abstract 类来包含审计相关字段,如下所示:
- @MappedSuperclass
- @EntityListeners(AuditingEntityListener.class)
- public abstract class Auditable {
-
- @CreatedBy
- @Column(columnDefinition = "bigint default 1", updatable = false)
- protected Long createdBy;
-
- @CreatedDate
- @Column(columnDefinition = "timestamp default '2020-04-10 20:47:05.967394'", updatable = false)
- protected LocalDateTime createdDate;
-
- @LastModifiedBy
- @Column(columnDefinition = "bigint default 1")
- protected Long lastModifiedBy;
-
- @LastModifiedDate
- @Column(columnDefinition = "timestamp default '2020-04-10 20:47:05.967394'")
- protected LocalDateTime lastModifiedDate;
-
- public Long getCreatedBy() {
- return createdBy;
- }
-
- public void setCreatedBy(Long createdBy) {
- this.createdBy = createdBy;
- }
-
- public LocalDateTime getCreatedDate() {
- return createdDate;
- }
-
- public void setCreatedDate(LocalDateTime createdDate) {
- this.createdDate = createdDate;
- }
-
- public Long getLastModifiedBy() {
- return lastModifiedBy;
- }
-
- public void setLastModifiedBy(Long lastModifiedBy) {
- this.lastModifiedBy = lastModifiedBy;
- }
-
- public LocalDateTime getLastModifiedDate() {
- return lastModifiedDate;
- }
-
- public void setLastModifiedDate(LocalDateTime lastModifiedDate) {
- this.lastModifiedDate = lastModifiedDate;
- }
- }
@MappedSuperclass注解用于指定类本身不是实体,但其属性可以采用与实体相同的方式映射,但是此映射仅适用于其子类。所以每个类继承抽象类Auditable将包含这些属性。
@EntityListeners注释用于配置AuditingEntityListener其中包含方法@PrePersist和@PreUpdate,以便捕获审核信息
为了在 Spring 中启用审计功能,我们需要使用@EnableJpaAuditing注释。
- @SpringBootApplication
- @EnableJpaAuditing
- public class BackendApplication {
- public static void main(String[] args) {
- SpringApplication.run(BackendApplication.class, args);
- }
- }
createdDate和lastModifiedDate字段根据当前时间填充。此外,createdBy和lastModifiedBy需要一种方法来获取正在执行操作的用户。为了提供这些信息,我们需要实现AuditorAware接口。
- @Component
- public class AuditAwareImpl implements AuditorAware
{ -
- @Override
- public Optional
getCurrentAuditor() { - ApplicationUser principal = (ApplicationUser) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
- return Optional.of(principal.getId());
- }
- }
我们添加了 getCurrentAuditor的实现,因为它被调用以检索正在执行操作的用户。
现在我们可以在要使用的实体中扩展类 Auditable审计.例如:
- @Entity
- @Data
- public class Category extends Auditable {
-
- @GeneratedValue(strategy = GenerationType.IDENTITY)
- @Id
- private Long id;
- private String title;
-
- // ..
- }
审核字段将自动填充:
