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

文章目录

    在使用 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 聊聊,或者关注我的个人公众号“大象工具”, 查看更多联系方式