2016-12-05 52 views
2

我有一个Hibernate 5中的实体,它具有创建和上次修改时间戳。我希望他们获得自动更新。休眠5:自动更新最后修改的时间戳字段

/** 
* 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> 

但不知道如何使用注释做,在休眠5。

回答

5

方法1:

您可以使用类似如下:

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

@PreUpdate 
protected void onUpdate() { 
lastUpdate = new Date(); 
} 

注:如果您使用的Session API JPA回调将无法正常工作。

方法2:

您可以批注lastUpdate@Version注解。除了自动填充字段外,它还会为实体引入乐观锁定。对于createdOn字段,您可以简单地在实体的默认构造函数中初始化它。

方法3:

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

方法4: 您也可以使用分别与@CreationTimestamp注释@UpdateTimestampcreatedOnlastUpdate领域。

+0

方法1并没有为我工作。方法2做了。 –

+0

Hibernate 5.2是否支持PrePersist和PreUpdate? –

+0

我的实体是由json形式的web客户端提供的,我将其反序列化为POJO。所以我不想从客户端设置创建和更新时间,而是服务器应该自己做。但没有任何方法的工作。 –

0

值得使用的setter方法

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