2012-05-18 73 views
14

我一直在用spring-data處理REST風格的web服務。前幾天有一個特殊的spring-data jpa REST框架was released在spring-data項目中使用@Version

現在我注意到在這個框架中使用@Version的能力。這個版本是由它自己生成還是需要手動執行?

是否有可能使用它自己的@Version? (所以我不需要改變任何東西到我現有的軟件庫/域等)。

我是否需要做一些額外的配置來使用@Version?

回答

34

自從我發佈這個問題已經有一段時間了,但我已經想通了。我會解釋我做了什麼,這樣可能對別人有幫助。

註釋@Version是一個javax.persistence接口,而不是前面提到的spring-data rest jpa框架。

如果你想使用@版本,你需要在你的域對象來創建一個版本字段,像這樣:

@Version 
@Column(name = "VERSION") 
private long version; 

如果您在使用Hibernate它會自動挑選註解,它會創建你的(在我的情況下MySql)表中的「版本」行。每次記錄更新時,休眠將使計數器增加1.

現在爲什麼這是你想要的東西?那麼你可能想要使用它的原因是因爲它減少了你的客戶與stale data合作的機會。每當客戶從您那裏獲取信息時,都會提供他所請求的數據。例如

{      <-- School entity --> 
    "id": 1, 
    "version": 0,     
    "name": "De regenboog", 
    "street": "Plantaanstraat", 
    "number": "2", 
    "zipCode": "1234AS", 
    "city": "Amsterdam" 
} 

現在,如果客戶想要更改關於此特定記錄的某些信息,它會發送新信息以及版本值。在這種情況下,讓我們改變學校的名稱。

{      <-- School entity --> 
    "id": 1, 
    "version": 0,     
    "name": "Stackoverflow", 
    "street": "Plantaanstraat", 
    "number": "2", 
    "zipCode": "1234AS", 
    "city": "Amsterdam" 
} 

Hibernate提出一個包含您的信息的查詢,並添加一個額外的'where'子句來檢查版本。 update .... where id = 1 and version = 0。現在,如果該行已更新,則表示您提供了正確的版本,並且在您請求信息之間沒有其他人更改過這些特定信息,並將其更改併發回。好吧?

現在如果行未更新,該怎麼辦?這意味着有人在你要求提供信息後正在進行快速衛生間休息時更新了這一行。這意味着你的版本已經過時了!現在需要發生什麼是真正的用例特定,所以我不會詳細介紹:)

希望有人可以使用這條信息!

感謝所有

+0

這確實有道理。它肯定幫了我。感謝 – kalz

1

確保進口 進口javax.persistence.Version

,而不是一個春天。

+0

我已經在我的答案中加入了:「註釋@Version是一個javax.persistence接口,而不是我之前提到的spring-data rest jpa框架。」 –

+1

重要的註釋原因。Spring @ Version註釋適用於除JPA之外的所有內容。請參閱http://stackoverflow.com/a/31883006/328808。 –

相關問題