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 <Long> {
@Override
public Optional <Long> 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;
// ..
}
审核字段将自动填充: