JPA提供了一种事件监听器的机制,用于SQL审计,通过监听器我们可以很快速地去自动更新创建时间、修改时间,主要步骤如下:
一、创建基础实体,包含了创建和修改时间,然后让其他真正的实体继承该实体,减少重复冗余代码
@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
@Getter
public class AbstractAuditEntity implements Serializable {
@CreatedDate
@Column(name = "create_time", nullable = false, updatable = false)
private Date createTime;
@LastModifiedDate
@Column(name = "update_time", nullable = false)
private Date updateTime;
}
注意,需要两个注解,MappedSuperclass代表是基础实体,不会创建数据库表,EntityListeners注解启用监听器,我们需要使用的是AuditingEntityListener这个监听器。
同时,CreatedDate、LastModifiedDate代表会在创建和修改时更新时间字段,包括创建时间和修改时间。
二、启用JPA的审计功能
启动类需要加上EnableJpaAuditing注解。
三、修改已有实体类
四、如果已经集成QueryDSL,请重新compile一下:
可以看到会自动加上super相关字段。
五、调试接口查看下效果:
默认createTime和updateTime都会填上,然后我们试下修改:
我们会发现,修改后,更新时间为什么没有发生改变?
原因::JSR 317规范指出,对实体类的生命周期操作,不应该通过EntityManager或Query注解实现,所以Audit无法捕获Query注解产生的更新。例如:
解决方法是,单独更新时间,或通过JPA标准规范更新实体,如下:
最终效果:
可以看到CREATE_TIME和UPDATE_TIME都更新了。