跳至主要內容

SpringDataJPA Auditing 及其事件详解

logycoconut关于技术SpringDataJPA大约 1 分钟

我们在实际开发中,对表中记录经常需要记录是谁创建的、谁最后修改过、修改时间是什么时候

Auditing 意为审计,是 JPA 自带的功能实现

基本实现

四个注解

  • @CreatedDate
  • @LastModifiedDate
  • @CreatedBy
  • @LastModifiedBy

代码示例

// 实体类
@Data
@Entity
@EntityListeners(AuditingEntityListener.class)  // 表明需要审计功能
public class Employee {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long id;
    private String name;
    private String code;

    // 以下是JPA支持自动修改的注解
    @CreatedDate
    private Date createTime;
    @LastModifiedDate
    private Date lastModifiedTime;
    @CreatedBy
    private String createUser;
    @LastModifiedBy
    private String lastModifiedUser;

}

// 实现自己的AuditorAware
public class MyAuditorAware implements AuditorAware<String> {

    @Override
    public Optional<String> getCurrentAuditor() {
        return Optional.of("hall");
    }

}

// 开启JPA的审计功能
@SpringBootApplication
@EnableJpaAuditing
public class DemoApplication {

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

    // 注入自己实现的AuditorAware类
    @Bean
    public AuditorAware<String> auditorProvider() {
        return new MyAuditorAware();
    }

}

扩展成Entity基类

@Data
@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
public abstract class AbstractAuditable {

    @CreatedDate
    private Date createTime;
    @LastModifiedDate
    private Date lastModifiedTime;
    @CreatedBy
    private String createUser;
    @LastModifiedBy
    private String lastModifiedUser;

}

Listener扩展

Callbacks 注解方式

TypeDescription
@PrePersist新增之前
@PostPersist新增之后
@PreUpdate更新之前
@PostUpdate更新之后
@PreRemove删除之前
@PostRemove删除之后
@PostLoad加载之后

需要注意的是,这些方法都是同步机制,一旦报错将会影响所有底层代码执行。实际工作中实现这些方法的时候,方法体里面开启异步线程或者消息队列来异步处理

代码示例

// 实体类
@Data
@Entity
@EntityListeners(EmployeeAuditListener.class)
public class Employee extends AbstractAuditable {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long id;
    private String name;
    private String code;


}

// 自定义Listener
@Slf4j
public class EmployeeAuditListener {

    @PostPersist
    private void postPersist(Employee employee) {
        log.info("新增啦,{}", employee);
    }

}

JPA 的乐观锁实现 @Version

只需要在字段上加上 Version 注解

@Version
private Long version;