フェッチ戦略 は、アプリケーションが関連をナビゲートする必要があるときに、 Hibernate が関連オブジェクトを復元するために使用する戦略です。フェッチ戦略は O/R マッピングのメタデータに宣言するか、特定の HQL 、 Criteria クエリでオーバーライドします。
Hibernate3 は次に示すフェッチ戦略を定義しています:
結合フェッチ - Hibernate は OUTER JOIN を使って、関連するインスタンスやコレクションを1つの SELECT で復元します。
セレクトフェッチ - 2回目の SELECT で関連するエンティティやコレクションを復元します。 lazy="false" で明示的に遅延フェッチを無効にしなければ、この2回目の select は実際に関連にアクセスしたときのみ実行されるでしょう。
サブセレクトフェッチ - 2回目の SELECT で、直前のクエリやフェッチで復元したすべての要素に関連するコレクションを復元します。 lazy="false" で明示的に遅延フェッチを無効にしなければ、この2回目の select は実際に関連にアクセスしたときのみ実行されるでしょう。
バッチフェッチ - セレクトフェッチのための最適化された戦略 - Hibernate はエンティティのインスタンスやコレクションの一群を1回の SELECT で復元します。これは主キーや外部キーのリストを指定することにより行います。
Hibernate は次に示す戦略とも区別をします:
即時フェッチ - 所有者のオブジェクトがロードされたときに、関連、コレクションは即時にフェッチされます。
遅延コレクションフェッチ - アプリケーションがコレクションに対して操作を行ったときにコレクションをフェッチします。(これはコレクションに対するデフォルトの動作です)
「特別な遅延」コレクションフェッチ - コレクションの要素1つ1つが独立して、必要なときにデータベースから取得されます。 Hibernate は必要ないならば、コレクション全体をメモリにフェッチすることは避けます(とても大きなコレクションに適しています)。
プロキシフェッチ - 単一値関連は、識別子の getter 以外のメソッドが関連オブジェクトで呼び出されるときにフェッチされます。
「プロキシなし」フェッチ - 単一値関連は、インスタンス変数にアクセスされたときにフェッチされます。プロキシフェッチと比較すると、この方法は遅延の度合いが少ない(関連は識別子にアクセスしただけでもフェッチされます)ですが、より透過的で、アプリケーションにプロキシが存在しないように見せます。この方法はビルド時のバイトコード組み込みが必要になり、使う場面はまれです。
遅延属性フェッチ - 属性や単一値関連は、インスタンス変数にアクセスしたときにフェッチされます。この方法はビルド時のバイトコード組み込みが必要になり、使う場面はまれです。
二つの直行する概念があります: いつ 関連をフェッチするか、そして、 どうやって フェッチするか(どんな SQL を使って)。これらを混同しないでください。 fetch はパフォーマンスチューニングに使います。 lazy はあるクラスの分離されたインスタンスのうち、どのデータを常に使用可能にするかの取り決めを定義します。