难以设置具有休眠 JPA 注释的自动生成时间

2022-09-02 05:17:03

多亏了你们,我对冬眠的知识得到了彻底的改善。现在我在这里打了一个关于current_timestamp的块。这是我的代码

@Column(name="DATE_CREATED", insertable=false, updatable=false, columnDefinition="timestamp default current_timestamp")
@org.hibernate.annotations.Generated(value=GenerationTime.INSERT)
@Temporal(javax.persistence.TemporalType.TIMESTAMP)
private Date dateCreated;

@Column(name="LAST_MODIFIED", insertable=false, updatable=false, columnDefinition="datetime")
@org.hibernate.annotations.Generated(value=GenerationTime.ALWAYS)
@Temporal(javax.persistence.TemporalType.TIMESTAMP)
private Date lastModified;

我想date_created获得current_timestamp,我希望lastmodified插入每次更新的时间。显然我不能在同一个表上有2个current_timestamp字段。还有其他方法可以实现这一目标吗?感谢您的阅读


答案 1

这与Hibernate本身无关。上面指定的注释告诉Hibernate,这些值将由数据库生成,因此需要在插入/更新实体后重新加载。

如果这是您想要采用的方式,则需要配置数据库(例如,通过创建触发器)以根据需要填充/列。date_createdlast_modified

另一种方法是不要将这些字段标记为已生成,而是在 Java 代码中更新它们。如果您使用的是JPA(通过Hibernate EntityManager),那么通过@PrePersist / @PreUpdate回调方法来执行此操作是相当微不足道的:

@PreUpdate
@PrePersist
public void updateTimeStamps() {
    lastModified = new Date();
    if (dateCreated==null) {
      dateCreated = new Date();
    }
}

答案 2

您可以通过休眠和注释来实现相同的目标,例如@CreationTimestamp@UpdateTimestamp

@Column(name = "CREATED")
@CreationTimestamp
private LocalDateTime created;

@Column(name = "LAST_UPDATED")
@UpdateTimestamp
private LocalDateTime lastUpdated;

推荐