2011-03-25 3 views
9

Hibernateコミュニティに投稿された人物と同じ質問があります:FetchProfiles階層内の深い子オブジェクトをロードするためにHibernate FetchProfileを取得する方法

次のように私は、データモデルの関係を持っているパフォーマンス上の理由から

:私はCと負荷Dを熱心にすることができますが、私は熱心に私が知っているE.をロードする方法を見つけ出すことはできません

のFetchProfileを使用
...C -[FetchType.LAZY]-> D -> [FetchType.LAZY] -> 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を有効にして成功し、エラーとCとD取り込まれていないとsession.getを使用する - Eですまだ怠惰で、人口が不足している。絶望的に私はCの下から協会のドット表記をしようと思いました。私は深さ1の例しか見つけることができません。

これは、私の知識の中で満たされなければならないOCDタイプのギャップです!

ご協力いただきありがとうございます。

+0

C、D、Eクラスの注釈を投稿できますか? (FetchTypesに加えて) –

答えて

3

あなたは、C objを含むB objを含むA objを持っています。

@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; 
    } 
} 
0デフォルトでは、彼らはクラス

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

です

あなたはAでBがいっぱいになるでしょう。これは非常に基本的な解決策です。フェッチプロファイルのリストを引数としてDaoメソッドを作成することができます。

関連する問題