2013-04-29 75 views
1

我有一個Spring + JPA(Hibernate)Web應用程序。Spring,JPA,Hibernate:如何防止更改對象的時間戳

我有具有以下字段的類:

private Date updatedTime; 

@Version 
@Temporal(TemporalType.TIMESTAMP) 
public Date getUpdatedTime() { 
    return updatedTime; 
} 

public void setUpdatedTime(Date lastUpdatedTime) { 
    this.updatedTime = lastUpdatedTime; 
} 

在服務層的事務的方法,我需要加載這個類的一個實例和複製(經由XStream的)之前修改它的所有其屬性添加到同一個類的新實例中(我必須遵循此順序,因爲我不想複製一些不需要的大數據字段(Collection字段,其中包含該類的每個實例唯一的「詳細」對象)實例到新的)。當新實例保存到數據庫時,該方法返回。現在舊實例的updatedTime字段被更新。我怎樣才能防止它發生?

感謝您的幫助!

問候。

回答

1

JPA支持使用樂觀鎖定版本字段,每個更新都會更新 。該字段可以是數字或時間戳 值。 建議使用數字值,因爲數字值比 時間戳更精確,更便於使用,更高效,更易於處理。

如文檔中所述,版本字段會隱式更新。您可以在實體中使用單獨的字段作爲版本,因爲時間戳字段&的依賴性限制了它的更新。


編輯:

樂觀鎖允許&跟蹤基於該版本字段&它與實體一起更新的變化併發事務。

在事務提交之前,檢查版本字段是否已被其他事務更改,因爲實體已被讀取。

UPDATE ENTITY SET ..., version = version+1 WHERE version = previousVersion

鎖定模式PESSIMISTIC_FORCE_INCREMENT & OPTIMISTIC_FORCE_INCREMENT將迫使版本字段遞增。

悲觀鎖定在從數據庫獲取實體時鎖定數據庫行。

指定鎖定模式爲OPTIMISTICPESSIMISTIC_READ,PESSIMISTIC_WRITE,它不會更新版本字段。

  • 除了必填字段之外,您可以爲版本提供額外的專用字段。

  • 否則,可以指定適當的鎖定模式以防止更新版本字段。

+0

嗨Nayan,非常感謝您的支持。我會考慮使用版本字段的數字值。但我的意圖是阻止版本字段在我的情況下得到更新。在我的情況下,數字版本字段是否會更新? 「你的意思是依賴於時間戳字段並限制它不被更新。」 ?再次感謝! – curious1 2013-05-02 01:14:59

+0

@ curious1我已更新帖子並提供更多信息,請參閱編輯部分。 – 2013-05-02 05:08:21