How can you make a created_at column generate the creation date-time automatically like an ID automatically gets created?

后端 未结 4 1066
小蘑菇
小蘑菇 2020-12-17 09:25

I currently have an Entity as below:

@Entity
public class Product {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long productId;
          


        
相关标签:
4条回答
  • 2020-12-17 09:38

    With the mix of @dimitrisli and @buddha answers, something pretty clean is

    @Data
    @MappedSuperclass
    public abstract class BaseEntity {
    
        @Column(updatable = false)
        @CreationTimestamp
        private LocalDateTime createdAt;
        @UpdateTimestamp
        private LocalDateTime updatedAt;
    }
    

    And now you all your entity can extend that class like so

    @Data
    @Entity
    @EqualsAndHashCode(callSuper = true)
    public class User extends BaseEntity {
    
        @Id
        @GeneratedValue
        public UUID id;
        public String userName;
        public String email;
        public String firstName;
        public String lastName;
    }
    

    Note that you might not need @Data & @EqualsAndHashCodeannotation annotations from lombok as it generate getter/setter

    0 讨论(0)
  • 2020-12-17 09:39

    JPA

    There isn't anything as convenient as annotating the Timestamp field directly but you could use the @PrePersist, @PreUpdate annotations and with little effort achieve the same results.

    Hibernate

    • @CreationTimestamp - Documentation
    • @UpdateTimestamp - Documentation

    Spring Data JPA

    • @CreatedDate - Documentation
    • @LastModifiedDate - Documentation
    0 讨论(0)
  • 2020-12-17 09:44

    Extend the following abstract class in your entity:

    @MappedSuperclass
    @EntityListeners(AuditingEntityListener.class)
    public abstract class DateAudit implements Serializable {
        @CreatedDate
        @Column(name = "created_at", nullable = false, updatable = false)
        private Date createdAt;
    
        @LastModifiedDate
        @Column(name = "updated_at")
        private LocalDateTime updatedAt;
    }
    

    Don't forget to enable JPA Auditing feature using @EnableJpaAuditing

    Read this: https://docs.spring.io/spring-data/jpa/docs/1.7.0.DATAJPA-580-SNAPSHOT/reference/html/auditing.html

    0 讨论(0)
  • 2020-12-17 09:58

    You can create a BaseEntity. Each entity extends the BaseEntity. In the Base entity ,it will set the time automatically

    @Data
    @MappedSuperclass
    @Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
    public abstract class BaseEntity implements Serializable {
    
        @Id
        @Column(name = "Id")
        private String id;
    
        @Column(name = "deleted", columnDefinition = "Bit(1) default false")
        private boolean deleted = false;
    
        @Column(name = "DataChange_CreatedBy", nullable = false)
        private String dataChangeCreatedBy;
    
        @Column(name = "DataChange_CreatedTime", nullable = false)
        private Date dataChangeCreatedTime;
    
        @Column(name = "DataChange_LastModifiedBy")
        private String dataChangeLastModifiedBy;
    
        @Column(name = "DataChange_LastTime")
        private Date dataChangeLastModifiedTime;
    
        @PrePersist
        protected void prePersist() {
            if (this.dataChangeCreatedTime == null) dataChangeCreatedTime = new Date();
            if (this.dataChangeLastModifiedTime == null) dataChangeLastModifiedTime = new Date();
        }
    
        @PreUpdate
        protected void preUpdate() {
            this.dataChangeLastModifiedTime = new Date();
        }
    
        @PreRemove
        protected void preRemove() {
            this.dataChangeLastModifiedTime = new Date();
        }
    }
    
    0 讨论(0)
提交回复
热议问题