2017-07-17 77 views
1

我想在SQLServer上設置JPA樂觀鎖定。爲此,我使用TIMESTAMP列(SQLServer TIMESTAMP是遞增的數字,不保留日期或時間)。JPA與SQLServer樂觀鎖定TIMESTAMP

正在自動遞增的數字,在我的Java實體需要設置插入/更新到false否則我會得到一個異常:

com.microsoft.sqlserver.jdbc.SQLServerException:無法更新時間戳列

這裏是我的Java實體映射:

@Version 
@Column(name = "TSROWVERSION", insertable = false, updatable = false) 
private byte[] version; 

當我更新記錄這個S QL執行:

(1) *SELECT ... FROM cmd_e_entities WHERE uidentity=?* 

(2) *UPDATE cmd_e_entities SET... WHERE uidentity=?* 

,但我期待得到的東西,如:

(3) *UPDATE cmd_e_entities SET... WHERE uidentity=? AND tsrowversion=?* 

Hibernate的執行首先SELECT檢查,如果該記錄已改變(1),然後將其更新(2) 。如果記錄被修改它拋出一個異常:

org.hibernate.StaleObjectStateException:行被更新或者通過其他交易

所以它工作正常刪除,但我期待UPDATE考慮到說明版本(3)。實際上,如果將sql的類型從TIMESTAMP更改爲NUMBER並刪除可插入/可更新,它將按預期工作。

如果UPDATE不考慮版本(... AND tsrowversion=?)如何保證樂觀鎖定?我如何獲得預期的行爲?

回答

0

Hibernate檢查內存實體的版本是否與持久化版本相同。實體的id不會改變,除了Hibernate只保留一個實體版本,所以不需要對版本列進行「過濾」。 也許這個JPA and optimistic locking modes可以幫助