Spring Data JPA为跟踪持久性层的变化提供了很好的支持。通过使用审核,我们可以存储或记录有关实体更改的信息,例如谁创建或更改了实体以及何时进行更改。
我们可以利用实体字段上的@CreatedBy,@CreatedDate,@LastModifiedDate,@LastModifiedBy注释来指示 Spring JPA 透明地填充这些字段。我们可以按如下方式使用注释:
@Entity
public class Category {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private Long id;private Long title;@CreatedByprivate Long createdBy;@CreatedDateprivate LocalDateTime createdDate;@LastModifiedByprivate Long lastModifiedBy;@LastModifiedDateprivate 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 {@Overridepublic 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)@Idprivate Long id;private String title;// ..
}
审核字段将自动填充:

上一篇:际的成语有哪些