Spring Data JPA 提供了Audit審計功能,用來記錄創建時間、創建人、修改時間、修改人等,對應的註解爲@CreateDate、@CreatedBy、@LastModifiedDate、@LastModifiedBy。下面來詳細講解下如何使用。
1、啓用Audit功能
@EnableJpaAuditing註解用於啓動JPA的Audit審計功能。
需要注意的是,@CreatedBy和@LastModifiedBy的值需要我們來指定,因此我們需要實現AuditorAware接口。
import org.springframework.context.annotation.Configuration;
import org.springframework.data.domain.AuditorAware;
import org.springframework.data.jpa.repository.config.EnableJpaAuditing;
import org.springframework.security.core.context.SecurityContextHolder;
import java.util.Optional;
@Configuration
@EnableJpaAuditing
public class AuditorAwareImpl implements AuditorAware<String> {
@Override
public Optional<String> getCurrentAuditor() {
return Optional.of(SecurityContextHolder.getContext().getAuthentication().getName());
}
}
這裏使用Spring Security登錄用戶的username作爲current auditor。
2、Entity:聲明@EntityListeners和使用審計註解
@Data
@Entity
@EntityListeners(AuditingEntityListener.class)
@Table(name = "student", schema = "school_schema")
@GenericGenerator(name = "uuidGenerator", strategy = "uuid")
@TypeDefs({@TypeDef(name = "jsonb", typeClass = JsonBinaryType.class)})
public class Student implements Serializable {
private static final long serialVersionUID = 234546445462383751L;
@Id
@Column(name = "id")
@GeneratedValue(generator = "uuidGenerator")
private String id;
@Column(name = "name", nullable = false)
private String name;
@Column(name = "gender")
@Enumerated(EnumType.STRING)
private GenderEnum gender;
@Type(type = "jsonb")
@Column(name = "birthday")
private Birthday birthday;
@CreatedBy
private String createdBy;
@CreatedDate
@Temporal(TemporalType.TIMESTAMP)
private Date createdDate;
@LastModifiedBy
private String lastModifiedBy;
@LastModifiedDate
@Temporal(TemporalType.TIMESTAMP)
private Date lastModifiedDate;
}
@EntityListeners(AuditingEntityListener.class) 用於在實體類上啓動Audit功能。
@CreateDate表示該字段爲創建時間,在這個實體被 insert 的時候,會設置默認值。@CreatedBy表示該字段爲創建人,在這個實體被insert的時候,會設置值。@LastModifiedDate、@LastModifiedBy同理。
額外補充:
1⃣️ @Enumerated(EnumType.STRING)表示該字段是枚舉類,保存到數據庫時使用該枚舉類的name。
2⃣️ @TypeDefs({@TypeDef(name = "jsonb", typeClass = JsonBinaryType.class)}) 定義了字段類型是JsonBinaryType,在通過@Type(type = "jsonb")註解表示該字段是自定義的一個POJO,保存到數據庫時是json類型的字符串。
==》How to map JSON objects using generic Hibernate Types
3、對應的SQL Schema
create schema if not exists school_schema;
create table if not exists school_schema.student(
id varchar(50) primary key ,
name varchar(64) not null ,
gender varchar(10) not null ,
birthday jsonb ,
created_by varchar(64) ,
created_Date timestamp(4) with time zone ,
last_modified_by varchar(64) ,
last_modified_date timestamp(4) with time zone
);
4、總結
-
實現 AuditorAware 接口來返回創建人、修改人信息
-
在Application啓動類或者Component上添加@EnableJpaAuditing
-
實體類上添加 @EntityListeners(AuditingEntityListener.class)
-
在需要的字段上加上 @CreatedDate、@CreatedBy、@LastModifiedDate、@LastModifiedBy 等註解。