2011-11-08 8 views
2

関連するエンティティにはlazy=falseというマッピングファイルがあります。これは多くのユースケースには意味がありますが、いくつかの例外があります。問題は、これらのケースでクエリ時に関連する関連付けを取得したくないということです。これらのケースは非常に高価です。hibernateマッピングファイル内の関連するエンティティのレイジーローディング設定をオーバーライド

エンティティのマッピングの例。

<class name="Category" table="category"> 
    <id name="id" type="string"> 
     <column length="50" name="id"/> 
     <generator class="uuid"/> 
    </id> 
    <property name="name" type="string"> 
     <column length="100" name="name" not-null="true"/> 
    </property> 
    <set inverse="true" lazy="false" name="categorySourcesList"> 
     <key> 
     <column length="50" name="categoryid" not-null="true"/> 
     </key> 
     <one-to-many class="CategorySource"/> 
    </set> 
    </class> 

私の質問は、マッピングファイルに設定されているlazy値をオーバーライドする方法があり、どちらかsql-queryに私は、カスタムの書き込みまたはDAOでのパラメータの1つとして遅延読み込みを可能にするのですか?またはいくつかの注釈を介して?

答えて

2

AFAIKでは、EAGERの読み込みをLAZYでオーバーライドすることはできません。

したがって、結合をLAZYと定義し、結合を使用したクエリでそれを上書きする必要があります。それを行うには他の方法があるかもしれませんが、私は今知っているすべてのことが怖いです。

3

はい、アノテーション付きまたはxmlマップの関連付けの取得方法を無効にすることができます。

Hibernate Documentation

Criteria criteria = session().createCriteria(MyClass.class); 
    criteria.add(Restrictions.eq("id", "1234"));   
    criteria.setFetchMode("children",FetchMode.EAGER); 
    return (MyClass) criteria.uniqueResult(); 

これは、あなたに熱心にフェッチされたその子とMyClassのインスタンスを返します。