1

休止状態では、一度にエンティティの子コレクションをクエリすることに気付きました。したがって、たとえば、PhoneNumber との OneToMany 関係と EmailAddress との OneToMany 関係を持つ Person エンティティがあります。1,000 人を返す Person エンティティに対して単純なクエリを実行すると、休止状態は EmailAddress に対して 1,000 件のクエリを作成し、PhoneNumber に対して 1,000 件のクエリを作成します。熱心なフェッチや怠惰なフェッチについてはしばらく忘れて、すべての人の電話と電子メールのコレクションにアクセスすると仮定しましょう。

これは素朴な実装のようです。これを変更する簡単な方法はありますか? これらは、Person ゲッター メソッドで簡単に取得できるように、Person 外部キーをキーとするマップに配置する必要があります。

Personクエリを実行する前に、電子メールと電話番号のセッションキャッシュにブルートフォースクエリを実行する以外に考えることはありますか?

TIA、追加のデータが必要な場合はお知らせください。

4

1 に答える 1

2

自分でクエリを実行する場合とは別に、ドキュメントで説明されているように、バッチ フェッチを有効にするだけです。

コレクションのバッチ フェッチを有効にすることもできます。たとえば、各 Person に Cat の遅延コレクションがあり、現在セッションに 10 人の人物がロードされている場合、すべての人物を反復処理すると、getCats() の呼び出しごとに 1 つずつ、10 の SELECT が生成されます。Person のマッピングで cats コレクションのバッチ フェッチを有効にすると、Hibernate はコレクションをプリフェッチできます。

于 2013-05-01T17:52:27.453 に答える