Java Hibernate 5:上次修改的自动更新时间戳字段

Java Hibernate 5:上次修改的自动更新时间戳字段,java,hibernate,Java,Hibernate,我在Hibernate5中有一个实体,它有创建和上次修改的时间戳。我想让他们自动更新 /** * Time of creation of entity */ @Column(name = "created_on", nullable = false) private Timestamp createdOn; /** * Time of last update */ @Column(name = "last_update", nullable = false) private Times

我在Hibernate5中有一个实体,它有创建和上次修改的时间戳。我想让他们自动更新

/**
 * Time of creation of entity
 */
@Column(name = "created_on", nullable = false)
private Timestamp createdOn;

/**
 * Time of last update
 */
@Column(name = "last_update", nullable = false)
private Timestamp lastUpdate;
我使用Hibernate 4实现了这一点,使用的映射xml文件如下:

    <property name="createdOn" type="java.sql.Timestamp" generated="insert" not-null="true">
        <column name="created_on" sql-type="timestamp" default="CURRENT_TIMESTAMP"/>
    </property>
    <property name="lastUpdate" type="java.sql.Timestamp" generated="always" not-null="true">
        <column name="last_update" sql-type="timestamp" default="CURRENT_TIMESTAMP"/>
    </property>


但是我不知道如何在Hibernate5中使用注释来完成它。

方法1:

您可以使用以下内容:

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

@PreUpdate
protected void onUpdate() {
 lastUpdate = new Date();
}
注意:如果您使用的是
Session
API,那么JPA回调将不起作用

方法2:

您可以使用
@Version
注释对
lastUpdate
字段进行注释。除了自动填充字段外,它还将为实体引入乐观锁定。对于
createdOn
字段,只需在实体的默认构造函数中对其进行初始化即可

方法3:

使用事件侦听器并手动更新相关属性。您需要创建一个扩展
DefaultSaveOrUpdateEventListener
并覆盖
onSaveOrUpdate
方法的侦听器。不要忘记注册事件侦听器

方法4:
您还可以分别为
createdOn
lastUpdate
字段使用
@CreationTimestamp
@UpdateTimestamp
注释。

值得使用setter方法

public void setLastUpdate ( TimeStamp lastu ) {
   this.lastUpdate = lastu == null ? 0 : new Date);
}

Hibernate 5.2是否支持PrePersist和PreUpdate?我的实体由web客户端以json的形式提供,我将其反序列化为POJO。所以我不想从客户端设置创建和更新时间,而应该由服务器自己设置。但是,如果在JSON中获得的值与当前托管实体中的值不同,则Hibernate 5.2不支持任何有效的方法。
@PrePersist
@PreUpdate
,然后,
@Version
将不会更新带注释的字段。如果来自客户端的值为空,该怎么办?请检查编辑答案中的方法4。这可能更直接、更简单。查看此项了解详细信息。