2010-12-07 12 views
16

私は簡単な質問があります。私は、これが私たちのプロジェクトの設定を休止が見つかりました:Hibernate XMLマッピング:Lazy FalseまたはFetch Select?

<many-to-one name="employee" 
    class="com.myapp.Employee" 
    cascade="merge" 
    lazy="false" 
    fetch="select"> 
<column name="employee_id" 
    sql-type="bigint" 
    not-null="true"/> 
</many-to-one> 

Fetching Strategiesをもとに、「すべてのコレクションとエンティティレイジーロード」を意味を「選択」=フェッチしません。しかし、lazy = "false"と書いてを意味するのは遅延ロードではありません。上記の設定では、「レイジーローディングを無効にし、レイジーローディングを有効にする」と記載しています。実際には、これはプロパティが遅延ロードされていることを意味しますか?

だから私のようにその設定を短縮することができます:

<many-to-one name="employee" 
    class="com.myapp.Employee" 
    cascade="merge" 
    fetch="select"> 
<column name="employee_id" 
    sql-type="bigint" 
    not-null="true"/> 
</many-to-one> 

しかしは=フェッチデフォルトモードを "選択" されていませんか?実際には、私は同じ設定を次のように宣言できます:

<many-to-one name="employee" 
    class="com.myapp.Employee" 
    cascade="merge"> 
<column name="employee_id" 
    sql-type="bigint" 
    not-null="true"/> 
</many-to-one> 

正しいですか?違う?アイデア?おかげ

私は遅延ロードを有効にしたい場合は、私は怠け者=「true」をと削除怠惰=「false」をを追加する必要がありますか?

答えて

38

フェッチモードとフェッチの時間は完全に重ならない概念だと思います。

Lazy="true|false"は、関連付けを熱心に実行するかオンデマンドで行うかを制御します。

fetch="select|subselect|join|batch"ロードする必要があるときに、そのエンティティまたはコレクションがどのようにロードされるかを制御します。だから、

fetch="select"手段を有する、あなたの質問に答えるために:「2番目のSELECTは、関連するエンティティやコレクションを取得するために使用されますが、明示的に怠惰=指定することで、遅延フェッチを無効にしない限り、」

を」偽を、この2回目の選択は、アソシエーションにアクセスするときにのみ実行されます。 (http://docs.jboss.org/hibernate/core/3.3/reference/en/html/performance.html#performance-fetching

これは、遅延読み込みが無効になっているわけではありません。これはlazy="true|false"フラグによって制御されます。 lazy="true"fetch="select"でHibernateはコレクションを遅延ロードし、selectでロードします。 lazy="false"を設定すると、同じ選択が実行されますが、違いは熱心に実行されることになります。これが理にかなってほしい。

こちらもご覧ください:http://community.jboss.org/wiki/AShortPrimerOnFetchingStrategies

0

怠惰に設定した場合、必要がない場合は外側のマップで従業員が選択されません。フェッチは、必要に応じて従業員にどのように問い合わせるかを示します。

+0

両方のプロパティを追加するのは冗長ではありませんか?彼らはお互いを否定しないのですよね? – chris

関連する問題