Spring Data JPA —— Audit 使用審計功能(附enum和jsonb如何映射到數據庫)

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、總結

  1. 實現 AuditorAware 接口來返回創建人、修改人信息

  2. 在Application啓動類或者Component上添加@EnableJpaAuditing

  3. 實體類上添加 @EntityListeners(AuditingEntityListener.class)

  4. 在需要的字段上加上 @CreatedDate、@CreatedBy、@LastModifiedDate、@LastModifiedBy 等註解。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章