Spring-Data-JPA的审计(Auditing)功能

在数据库建表过程中,create_time、update_time一般是必备字段,数据表设计中通常将这两个字段设置为”datetime(0) DEFAULT CURRENT_TIMESTAMP “,但是在实体类层面,如果每个实体对象都需要手动设置create_time和update_time将是一件繁琐而且不符合软件工程思想的事。Spring-Data-JPA提供了Auditing功能,只需加上几个注解便可实现自动填充字段。

注解字段

主要有4个注解:

@CreateBy,表示该字段为“创建者”字段,在实体被insert之时设置

@LastModifiedBy,表示该字段为“最后修改者”字段,在实体被update之时设置

@CreatedDate,表示该字段为“创建时间”字段,在实体被insert之时设置

@LastmodifiedDate,表示该字段为“修改时间”字段,在实体被update之时设置

用法

1、实体类添加注解@EntityListeners(AuditingEntityListener.class)

2、目标字段添加注解(@CreatedDate、@CreatedBy、@LastModifiedDate、@LastModifiedBy)

3、启动类添加注解@EnableJpaAuditing

4、实现AuditorAware接口返回需要插入的CreateBy和LastModifiedBy的值

代码

封装了一个实体基类如下,代码实现了第1、2步。

package com.migchar.library.entity;

import com.fasterxml.jackson.annotation.JsonFormat;
import org.springframework.data.annotation.CreatedBy;
import org.springframework.data.annotation.CreatedDate;
import org.springframework.data.annotation.LastModifiedBy;
import org.springframework.data.annotation.LastModifiedDate;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;
import org.springframework.format.annotation.DateTimeFormat;

import javax.persistence.*;
import java.util.Date;

/**
 * Created by Parker
 * From migchar.com
 */
@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
public abstract class BaseEntity {

    @Id
    @Column(length = 11, columnDefinition = "int UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '唯一标识'")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;

    @CreatedBy
    @Column(updatable = false)
    private String createBy;
    @LastModifiedBy
    private String updateBy;

    @CreatedDate
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
    @Column(updatable = false, nullable = false)
    private Date createTime;

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

    // Getter and Setter
}

@MappedSuperclass标注的基类不能再使用@Entity或@Table注解,也无需实现序列化接口。

第3步,启动类添加注解:

@SpringBootApplication
@EnableJpaAuditing
public class LibraryHeliumApplication {
 ​
    public static void main(String[] args) {
        SpringApplication.run(LibraryHeliumApplication.class, args);
    }
}

第4步,实现AuditorAware接口

package com.migchar.library.config;

import org.springframework.context.annotation.Configuration;
import org.springframework.data.domain.AuditorAware;
import java.util.Optional;

/**
 * Created by Parker
 * From migchar.com
 */
@Configuration
public class AuditorConfig implements AuditorAware {
    /**
     * 返回操作员标志信息
     *
     * @return
     */
    @Override
    public Optional<String> getCurrentAuditor() {
        // 这里根据实际业务情况获取具体信息
        return Optional.of("migchar.com");
    }
}

如果只插入@CreatedDate和@LastmodifiedDate,只需要实现前面3步。

自动填充功能只针对JPA Repository的save方法(eg//userRepository.save(user))有效,如果是自定义的@Query则无法自动填充,需要手动设置。