9.2 使用Hibernate和MySQL创建时间戳和最后更新时间戳 | Java Debug 笔记

229 阅读1分钟

本文正在参加「Java主题月 - Java Debug笔记活动」,详情查看<活动链接>

提问:使用Hibernate和MySQL创建时间戳和最后更新时间戳

对于某些Hibernate实体,我们需要存储其创建时间和上次更新时间。 您将如何设计?

1, 您将在数据库中使用哪些数据类型(假设使用MySQL,可能与JVM时区不同)? 数据类型是否可以识别时区?

2, 您将在Java中使用哪些数据类型(日期,日历,长型,...)?

3, 您将由谁负责设置时间戳(数据库,ORM框架(Hibernate)或应用程序程序员)?

4, 您将使用哪些注释进行映射(例如@Temporal)?

我不仅在寻找一个可行的解决方案,而且还在寻找一个安全且设计良好的解决方案。

回答1:

如果使用的是JPA注释,则可以使用@PrePersist和@PreUpdate事件挂钩执行此操作:

@Entity
@Table(name = "entities")    
public class Entity {
  ...

  private Date created;
  private Date updated;

  @PrePersist
  protected void onCreate() {
    created = new Date();
  }

  @PreUpdate
  protected void onUpdate() {
    updated = new Date();
  }
}

或者,您可以在类上使用@EntityListener批注,并将事件代码放置在外部类中。

回答2:

你可以使用@CreationTimestamp 和 @UpdateTimestamp:

@CreationTimestamp
@Temporal(TemporalType.TIMESTAMP)
@Column(name = "create_date")
private Date createDate;

@UpdateTimestamp
@Temporal(TemporalType.TIMESTAMP)
@Column(name = "modify_date")
private Date modifyDate;

回答3:

利用本文中的资源以及我从不同来源获得的信息,我带来了这个优雅的解决方案,创建了以下抽象类

import java.util.Date;

import javax.persistence.Column;
import javax.persistence.MappedSuperclass;
import javax.persistence.PrePersist;
import javax.persistence.PreUpdate;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;

@MappedSuperclass
public abstract class AbstractTimestampEntity {

    @Temporal(TemporalType.TIMESTAMP)
    @Column(name = "created", nullable = false)
    private Date created;

    @Temporal(TemporalType.TIMESTAMP)
    @Column(name = "updated", nullable = false)
    private Date updated;

    @PrePersist
    protected void onCreate() {
    updated = created = new Date();
    }

    @PreUpdate
    protected void onUpdate() {
    updated = new Date();
    }
}

你的继承该抽象类的子类:

@Entity
@Table(name = "campaign")
public class Campaign extends AbstractTimestampEntity implements Serializable {
...
}