使用hibernate JPA注释设置自动生成时间的困难时间

bla*_*sei 18 java hibernate jpa

感谢你们,我对hibernate的了解已经得到了很大的改善.现在我在这里打了一个关于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;
Run Code Online (Sandbox Code Playgroud)

我希望date_created获取current_timestamp,我希望lastmodified为每次更新插入时间.显然我不能在同一个表上有2个current_timestamp字段.还有其他方法可以实现吗?谢谢阅读

Chs*_*y76 48

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

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

另一种方法是不将这些字段标记为生成,而是在java代码中更新它们.如果您正在使用JPA(通过Hibernate EntityManager),通过@PrePersist/@PreUpdate回调方法执行此操作相当简单:

@PreUpdate
@PrePersist
public void updateTimeStamps() {
    lastModified = new Date();
    if (dateCreated==null) {
      dateCreated = new Date();
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 最好通过EntityListener和@Embeddable实体来完成此操作,这样您就可以在所有实体中重复使用时间戳/审计代码. (5认同)
  • @CraigRinger,您应该为此添加答案!:) (2认同)

mrk*_*nic 5

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

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

@Column(name = "LAST_UPDATED")
@UpdateTimestamp
private LocalDateTime lastUpdated;
Run Code Online (Sandbox Code Playgroud)