2010-10-29 85 views
0

通常,當您爲類的某個屬性定義映射時,NHibernate會在獲取屬性後立即將該值保存。它可以在獲取對象時立即獲取,也可以在第一次調用屬性獲取器時被延遲加載,但是一旦從數據庫中加載它被獲取。讓NHibernate在每次調用時都會獲取某些屬性

如果我錯了,請糾正我。

是否可以配置一個映射,使得同一個getter的每個單獨調用都會導致NHibernate進入數據庫並再次讀取該值?

背景:我有一個表和相應的類ExcelFile,它管理一些Excel文件的路徑和元數據。每個ExcelFile對象代表一個文件。

ExcelFile包含屬性IsLocked,LockedByDateLocked,目的是在有人正在處理文件時鎖定該文件。只要他關閉文件,鎖就會被釋放。

緩存這些特性可以引入競爭條件:

  • 愛麗絲加載DB條目以顯示它。它還顯示IsLocked。這是假的。 NHibernate緩存該值。
  • 鮑勃也是這樣,這是錯誤的。
  • 5分鐘後,Alice打開文件:應用程序再次檢查IsLocked,然後設置鎖定。
  • Bob打開文件:應用程序檢查已被緩存的IsLocked,該文件仍爲false。所以他設置了鎖並打開了應用程序。

爲了設置鎖定,我可以使用直接使用本地SQL查詢寫入數據庫的方法。到目前爲止,我閱讀這些屬性時也是這樣做的。

但是我需要查詢使用HQL設置的IsLocked。此外,自己編寫的簡單讀取和寫入相應表格字段的方法也引入了映射邏輯抵抗的第二個地方,這不是很好。

回答

1

你可能可以做到這一點,我聽說nHibernate現在支持延遲加載屬性,這是向這個方向邁出的一步。

但話雖如此,你仍然會有競爭狀態。你能避免出現競爭狀況的一種方法如下:

  1. 啓動事務
  2. 通過GET得到實體或刷新(使用升級鎖,這將避免死鎖應該Alice和Bob打分貝的確切的同一時間)
  3. 檢查IsLocked是真實的,如果是的話中止
  4. 設置IsLocked =真
  5. 提交事務。
+0

嗨拉恩,在我的情況下,我已經加載實體的時刻,有趣的部分來了(他們顯示在列表中)。這就是說,我認爲當然,我可以簡單地對你的觀點2中的實體進行更新。爲了完整起見,您可以將其納入您的答案中。延遲加載本身並不實用,因爲在第一次檢查鎖定之後,該屬性仍然被緩存。 – chiccodoro 2010-11-04 07:49:04

+0

關於刷新的好處,我補充說。 – Iain 2010-11-04 12:02:59

相關問題