Spring Data JPA 实现集成实体对象数据库的创建、修改时间字段自动更新

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的审计功能

Spring Data JPA 实现集成实体对象数据库的创建、修改时间字段自动更新_第1张图片

启动类需要加上EnableJpaAuditing注解。

三、修改已有实体类

Spring Data JPA 实现集成实体对象数据库的创建、修改时间字段自动更新_第2张图片

四、如果已经集成QueryDSL,请重新compile一下:

Spring Data JPA 实现集成实体对象数据库的创建、修改时间字段自动更新_第3张图片

可以看到会自动加上super相关字段。

五、调试接口查看下效果:

Spring Data JPA 实现集成实体对象数据库的创建、修改时间字段自动更新_第4张图片

默认createTime和updateTime都会填上,然后我们试下修改:

Spring Data JPA 实现集成实体对象数据库的创建、修改时间字段自动更新_第5张图片

我们会发现,修改后,更新时间为什么没有发生改变?

原因::JSR 317规范指出,对实体类的生命周期操作,不应该通过EntityManager或Query注解实现,所以Audit无法捕获Query注解产生的更新。例如:

解决方法是,单独更新时间,或通过JPA标准规范更新实体,如下:

Spring Data JPA 实现集成实体对象数据库的创建、修改时间字段自动更新_第6张图片

最终效果:

可以看到CREATE_TIME和UPDATE_TIME都更新了。

你可能感兴趣的:(Spring,Data,JPA,java,前端,数据库)