2009-12-03 50 views
15
@Entity 
public class Person { 
    @Id 
    @GeneratedValue(strategy=GenerationType.IDENTITY) 
    private Long id; 

    private int salary; 

    @Version 
    private long version; 

    // ...getters and setters 
} 
  1. 是否需要爲version創建setter/getter?
  2. 當用Hibernate持久化這個實體時,我不需要手動設置這個值,對嗎?
  3. 爲了在Spring的hibernateTemplate.saveOrUpdate中使用樂觀併發檢查,還需要配置什麼?是否支持所有數據庫?
  4. 如何對此實體進行單元測試?在我的數據庫中,顯示版本字段的所有記錄的值均爲0
  5. 每次都會調用hibernateTemplate.saveOrUpdate是否增加版本值?

回答

12

我會說:

  1. 設置/獲取版本是必需的,因爲你可能(重建舊數據的新實例時)分配自己的版本有時
  2. 你不需要,如果你從數據庫中讀取實例。 (當用新代碼在你的代碼中創建它時,這將是一個不同的故事)。
  3. 我什麼都看不到。我從來沒有遇到數據庫問題。
  4. 單元測試在我看來不會進入數據庫,因此涉及數據庫的測試稱爲集成測試。你不應該有太多它們,因爲它們很慢,而且它們並不真正測試你的代碼,而是更多的是Hibernate/Driver/Database代碼......你應該相信它們,或者只測試一次,但不能測試它們爲你所有的實體。
    要查看大於0的版本值,請在事務中讀取/修改/更新您的實體,版本將增加1。退出交易,重新執行,價值增加...
  5. 每次修改數據庫行時,版本都會增加。
+0

@KLE只是爲了防止2個用戶調用hibernatetemplate.saveorupdate同一時間,當調用hibernatetemplate.saveorupdate時不需要額外的檢查嗎?任何異常都會拋出? – cometta 2009-12-03 09:51:05

+1

@cometta重點不在於保存與否,而在於數據來自何處。在一個事務中,**如果你從數據庫**讀取一個實體,它的版本信息是最新的。當您保存它時,它會自動處理。如果您有一天會從其他來源獲取數據(例如表單的帖子),然後重新創建該實體,那麼您必須親自關注該版本。 – KLE 2009-12-03 10:01:10

+0

一個很好的解釋是在這裏:http://en.wikibooks.org/wiki/Java_Persistence/Locking – Zilvinas 2014-01-29 12:44:58