2010-02-14 52 views
1

假設您的類B帶有延遲加載的屬性c。並且除了以下內容,系統在任何地方都可以使用:覆蓋Hibernate的延遲加載的最佳方法

您有一個類A,屬性爲B,屬性爲b。無論何時加載A類型的實體,您都希望非懶惰地加載完整的a.b.c鏈。

有沒有辦法在Hibernate中設置這種類型的邏輯?

編輯:
的屬性也可以用一個formula這是一個SQL表達式定義。該文檔說:

一個強大的功能是導出 屬性。這些屬性是由 定義爲只讀。 值是在加載時計算的。您 將計算聲明爲SQL 表達式。然後,這將轉換爲 SELECT子句子查詢中加載一個實例的SQL查詢 :

<property name="totalPrice" 
    formula="(SELECT SUM (li.quantity*p.price) FROM [...])"/> 

,如果它是返回一個Hibernate對象的Hibernate查詢這會工作。

編輯2:
其他想法包括聲明一個類B2這是完全一樣B除了它的C屬性不延遲加載。

到目前爲止,選項

  1. 每次依靠查詢,通過skaffman的建議。
  2. 在屬性中使用公式來獲取我想要的字段,但是沒有對象。
  3. 創建一個B2類非懶惰b.c。 (有點醜)。

回答

1

使用HQL,像這樣:

from A as a 
    inner join fetch a.b 
    inner join fetch b.c 
+0

對於那些很好的查詢。但是如果我遍歷另一個對象的'.a'屬性,我就不會一次性獲得'a.b.c'。 – z5h 2010-02-14 20:20:32

+0

這的確如此,但是如果你將'B.c'配置爲延遲加載,那麼這就是它的行爲。如果你想覆蓋它,那麼你需要編寫你的查詢來顯式獲取它。 – skaffman 2010-02-14 20:31:54

2

如果這不是在您的應用程序一個共同的情況下(這不應該是),你可以手動初始化獲取的A後的依賴對象對象,使用Hibernate.initialize(..)