JPA EnableJpaAuditing 审计功能

关于自动填充或更新实体中的 CreateDate、CreatedBy 等在以前有一篇 jeecg 默认为空的字段值是如何被填充的? 有提到经过拦截器的方式实现,可是今天带你们了解一下若是使用 JPA 的审计功能是如何简单实现该操做的。html

JPA Audit 说明

在 Spring JPA 中,支持在字段或者方法上进行注解 @CreateDate、@CreatedBy、@LastModifiedDate、@LastModifiedByjava

@CreateDate
表示该字段为建立时间时间字段,在这个实体被 insert 的时候,会设置默认值微信

@CreatedBy
表示该字段为建立人,在这个实体被insert的时候,会设置值。app

@LastModifiedDate、@LastModifiedBy同理ide

附一张项目中的使用图:测试

如何使用审计?

难道就像上方图片显示的,只须要加上注解就能够了吗?spa

显然是否认的。code

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

  2. 在须要的字段上加上 @CreatedDate、@CreatedBy、@LastModifiedDate、@LastModifiedBy 等注解。htm

  3. 在Xxx Application 启动类上添加 @EnableJpaAuditing

  4. 实现 AuditorAware 接口来返回你须要插入的值。重点!

以下是一个基类的代码,实现了 一、2 步:

@Data
@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
public abstract class BaseEntity implements Serializable{

    private static final long serialVersionUID = 1L;

    @Id
    @ApiModelProperty(value = "惟一标识")
    private String id;

    @CreatedBy
    private String createBy;

    @CreatedDate
    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @ApiModelProperty(value = "建立时间")
    private Date createTime;

    @ApiModelProperty(value = "更新者")
    @LastModifiedBy
    private String updateBy;

    @LastModifiedDate
    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @ApiModelProperty(value = "更新时间")
    private Date updateTime;

}

第3步,启动类上增长注释:

@SpringBootApplication
@EnableJpaAuditing
public class TmaxApplication {

    public static void main(String[] args) {
        SpringApplication.run(TmaxApplication.class, args);
    }

  /**
     * 测试中若是没法自动识别,多是包路径的问题,采用手动声明bean的方式
     * @return
     */

    @Bean
    public UserAuditor setUserAuditorAware(){
        return new UserAuditor();
    }
}

通过测试若是你的实体类上面的多个字段使用了 @CreatedBy 这样的注解,只会有一个生效,也就是说在一次请求中,只会被调用一次

来看第4步,也是最重要的一步:

@Configuration
@Slf4j
public class UserAuditor implements AuditorAware<String{

    /**
     * 获取当前建立或修改的用户
     * @return
     */

    @Override
    public Optional<String> getCurrentAuditor() {

        UserDetails user;
        try {
            user = (UserDetails) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
            return Optional.ofNullable(user.getUsername());
        }catch (Exception e){
            return Optional.empty();
        }
    }
}

关于方法 getCurrentAuditor 中获取用户名的操做可根据本身实际状况书写,好比上方我用到的是 Spring Secirity 的一种写法。

若是文章有错的地方欢迎指正,你们互相留言交流。习惯在微信看技术文章,想要获取更多的Java资源的同窗,能够关注微信公众号:niceyoo

相关文章
相关标签/搜索