使用Hibernate和MySQL创建时间戳和上次更新时间戳

对于某个Hibernate实体,我们需要存储它的创建时间和上次更新的时间。 你会如何设计?

  • 你会在数据库中使用哪些数据类型(假设MySQL可能与JVM在不同的时区)? 数据类型是否可以识别时区?

  • 你将在Java中使用哪些数据类型( DateCalendarlong ,...)?

  • 你会为谁设置时间戳 - 数据库,ORM框架(Hibernate)还是应用程序员?

  • 你会用什么注释来进行映射(例如@Temporal )?

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


    如果您使用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注释并将事件代码放置在外部类中。


    本文中的资源以及来自不同来源的左右信息,我带着这个优雅的解决方案,创建了以下抽象类

    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 {
    ...
    }
    

    你可以使用@CreationTimestamp@UpdateTimestamp

    @CreationTimestamp
    @Temporal(TemporalType.TIMESTAMP)
    @Column(name = "create_date")
    private Date createDate;
    
    @UpdateTimestamp
    @Temporal(TemporalType.TIMESTAMP)
    @Column(name = "modify_date")
    private Date modifyDate;
    
    链接地址: http://www.djcxy.com/p/44043.html

    上一篇: Creation timestamp and last update timestamp with Hibernate and MySQL

    下一篇: How would you implement an LRU cache in Java?