2016-12-05 71 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); 
}