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

发布时间: 2020-11-26 15:38:46 作者: 大象笔记

在使用 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

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

参考

我是一名山东烟台的开发者,联系作者