web-dev-qa-db-ja.com

Hibernate XMLマッピング:Lazy FalseまたはFetch Select?

簡単な質問があります。私たちのプロジェクトでこのHibernate設定を見つけました:

<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>

fetch = "select"は、 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>

しかし、fetch = "select"はデフォルトモードではありませんか?したがって、実際には、次と同じ構成を宣言できます。

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

私は正しいですか?違う?アイデア?ありがとう

遅延読み込みを有効にする場合は、lazy = "true"を追加して削除する必要がありますlazy = "false"

21
chris

フェッチモードとフェッチ時間は、まったく重複しない概念だと思います。

Lazy="true|false"は、アソシエーションを積極的にロードするかオンデマンドでロードするかを制御します。

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

したがって、あなたの質問に答えるために、fetch="select"を持っているということは、

「関連付けられたエンティティまたはコレクションを取得するために2番目のSELECTが使用されます。lazy = "false"を指定して遅延フェッチを明示的に無効にしない限り、この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

44
octav

遅延に設定した場合、必要がない場合、外部マップは従業員を選択しません。フェッチは、必要な場合に従業員にどのように照会するかを示します。

1
HamoriZ