在使用 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 聊聊, 查看更多联系方式