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> {@Overridepublic 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;@CreatedByprivate String createdBy;@CreatedDate@Temporal(TemporalType.TIMESTAMP)private Date createdDate;@LastModifiedByprivate 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 等注解。