当前位置: 代码迷 >> 综合 >> Spring Data JPA —— Audit 使用审计功能(附enum和jsonb如何映射到数据库)
  详细解决方案

Spring Data JPA —— Audit 使用审计功能(附enum和jsonb如何映射到数据库)

热度:94   发布时间:2023-11-24 10:59:29.0

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、总结

  1. 实现 AuditorAware 接口来返回创建人、修改人信息

  2. 在Application启动类或者Component上添加@EnableJpaAuditing

  3. 实体类上添加 @EntityListeners(AuditingEntityListener.class)

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

 

  相关解决方案