Spring Entity 自动设置 created_at updated_at 字段的值

更新日期: 2020-11-26 阅读次数: 3722 字数: 300 分类: Java

在使用 Spring JPA 进行 ORM 操作,想简化时间字段的操作。

预期效果

可以像 PHP 的 Laravel Eloquent 一样,在 Model 进行 create,update 操作时,可以自动更新 created_at,updated_at 字段。

失败的尝试

@CreatedDate
private Date createdAt;

@LastModifiedDate
private Date updatedAt;

添加之后,并不生效,保存到数据库表中的值都是 null。

查了一下,还需要配置一堆其他东西,我感觉不够直观。所以,最终没有采用这种方案。

简单直接的一种方法

定义一个基类,设置字段 createdAt 和 updatedAt,利用 @PrePersist 和 @PreUpdate 来实现。 其他的 Entity 类来继承这个基类的实现就行了。

例如:

@Data
@MappedSuperclass
public abstract class BaseEntity {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private Date createdAt;
    private Date updatedAt;

    @PrePersist
    protected void prePersist() {
        if (this.createdAt == null) {
            this.createdAt = new Date();
        }
        if (this.updatedAt == null) {
            this.updatedAt = new Date();
        }
    }

    @PreUpdate
    protected void preUpdate() {
        this.updatedAt = new Date();
    }
}

@Data
@Entity
public class Article extends BaseEntity {
    @NotNull
    private String title;

    @NotNull
    @Column(unique = true)
    private String slug;
}

@MappedSuperclass的作用

标注为@MappedSuperclass的类将不是一个完整的实体类,他将不会映射到数据库表,但是他的属性都将映射到其子类的数据库字段中。

abstract class

抽象类可以被继承,但是不能被实例化。

参考

  • https://stackoverflow.com/questions/49954812/how-can-you-make-a-created-at-column-generate-the-creation-date-time-automatical
  • https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#auditing.annotations

关于作者 🌱

我是来自山东烟台的一名开发者,有敢兴趣的话题,或者软件开发需求,欢迎加微信 zhongwei 聊聊, 查看更多联系方式