2011-03-25 38 views
9

我有和Hibernate社區中發佈的人一樣的問題:FetchProfiles如何讓Hibernate的FetchProfile在層次結構中加載深層次的子對象

出於性能方面的原因,我必須在數據模型的關係如下:

...C -[FetchType.LAZY]-> D -> [FetchType.LAZY] -> E 

使用FetchProfile我熱切負荷d與C,但我無法弄清楚如何急切地加載E.我知道我可以使用內部連接成功使用NamedQuery,但它確實讓我感到困惑,因爲我無法解決如何使用FetchProfile來完成它。企圖FetchProfile的例子(其他任何東西是失去了在時間的迷霧):

@FetchProfile(name = "cwithDAndE", fetchOverrides = { 
     @FetchProfile.FetchOverride(entity = C.class, association = "dByCId", mode = FetchMode.JOIN), 
     @FetchProfile.FetchOverride(entity = D.class, association = "eByDId", mode = FetchMode.JOIN) 
}) 

我使FetchProfile了會議,併成功地使用session.get沒有錯誤,C和d填充 - E是仍然懶惰和無人居住。在絕望中,我記得嘗試從C向下的關聯點符號。我只能找到深度爲1的示例。

這是一個OCD類型的差距,在我的知識中需要填充!

在此先感謝您的幫助。

+0

您可以發佈C,D和E類的註釋嗎? (除了FetchTypes) – 2013-07-02 15:49:37

回答

3

您有一個包含B obj的A obj,包含一個C obj。默認情況下它們是

...A -[FetchType.LAZY]-> B -> [FetchType.LAZY] -> C 

一類:

@FetchProfiles({ 
    @FetchProfile(fetchOverrides = { @FetchOverride(association = "b", entity = A.class, mode = FetchMode.JOIN) }, name = "a-with-b") 
    }) 
@Entity 
@Table(name="EDITOR_IDENTITIES") 
public class A { 
    private B b;  
    //... 
} 

B級:

@FetchProfiles({ 
    @FetchProfile(fetchOverrides = { @FetchOverride(association = "c", entity = B.class, mode = FetchMode.JOIN) }, name = "b-with-c") 
    }) 
@Entity 
@Table(name="EDITOR_IDENTITIES") 
public class B { 
    private C c;  
    //... 
} 

ADAO類:

@Repository(value="aDaoImpl") 
@Transactional 
public class ADaoImpl { 

    @Override 
    public A loadByPrimaryKey(long id) 
    { 
     Session session = sessionFactory.getCurrentSession(); 
     session.enableFetchProfile("a-with-b"); 
     session.enableFetchProfile("b-with-c"); 
     Criteria criteria = session.createCriteria(A.class); 
     criteria.add(Restrictions.eq("id", id)); 
     A a = (A) criteria.uniqueResult(); 
     if(identity != null) 
      return identity; 
     else 
      return null; 
    } 
} 

你會得到一個充滿了B的C,這是一個非常基本的解決方案,你可以構建一個Dao方法,以獲取配置文件列表作爲參數。