2011-12-13 10 views
5

私はentity Aを持っています。これはentity Bと多対多の関係にあります。休止して、怠け者になったり怠けたりしないでください。

ので、テーブルのレイアウトは次のとおりです。A, AB(mapping table), B

は、エンティティAのオブジェクトを取得するには: は私が春を使用していgetHibernateTemplate().get(A.class, id)A.getById()を呼び出し、休止状態。

は、時々、その後のコードが必要なだけになるという問題が、時々、その後のコードが関連付けられているBさんにアクセスしていきますので、我々はいくつかのケースで遅延ロードや他のいくつかの例では熱心を使用したいと思います。問題は、すべてのデータベースアクセスが同じ単一ので提供されるため、1つのメソッドgetById()しか存在しないことです。

getById()メソッドを2つ作成する必要がありますか?

しかし、Aはまた、多対多の経由Cに接続されているならば、より複雑な場合のために、その後、遅延ロード-Cと熱心ローディング-Cのバリエーションがあるかもしれませんので、必要なgetById()はすぐにバリアント指数関数的に増加する。

この選択についてのあなたの意見はありますか?

ありがとうございます。

答えて

3

一般的な考慮事項については、fetching strategiesに関するHibernate 3.6ドキュメントを見てください。デフォルトのフェッチ戦略は、マッピングアノテーションまたはhbm.xmlファイルで定義されています。デフォルトのレイジーローディング戦略からeager-loading戦略に動的に切り替えるには、3つの方法があります。 Hibernateは3.5のでHQLクエリー

  • FETCHキーワード(ない非常に休止基準クエリで

    1. Criteria.setFetchMode():最初の二つは、遅延ローディングとイーガーローディングユースケースのためのDAOの方法の別の実装を必要とします確かに、おそらく3.6)fetch profilesを使用して遅延ロードからeager-loadingに動的に切り替える3番目のオプションがあります。

    フェッチプロファイルは、セッションスコープで有効/無効に設定されています。したがって、現在のセッションで目的のフェッチプロファイルが設定されている場合は、レイジーローディングとeager-loadingユースケースで同じDAOメソッドを使用できます。

    ここで注意すべき重要なことは、あなたがだけではなく、その逆熱心ローディング戦略に注釈やのhbm.xmlファイルに定義されている遅延ロード戦略から切り替えてできることです。この制限は、フェッチ戦略を切り替えるために使用される方法とは無関係です。

  • +0

    FetchProfileは素晴らしいです。アップデートに相当するものはありますか? – Tadhg

    3

    まあ、問題を正しく説明しました。シンプルさ(ただ一つの方法)とパフォーマンス(それぞれが正確に何が必要なのかを返す2つの方法)のトレードオフです。単一の方法を使用し、Bsを遅延ロードするだけで応答時間が正しい場合は、何も触れないでください。応答時間が長すぎる場合、eager-loadingを測定して正しいと判断したら、新しい方法を導入してください。

    単純なものにして、必要な場合にのみ最適化してください。 Lazy-loading associationsは高速です。なぜなら、データベースでインデックスを作成する必要がある外部キーに対してクエリを実行するだけなのでです。

    また、2つの多くの関連付けをロードするのは非常にまれです。カテゴリのすべての商品をページに表示するのは一般的ですが、カテゴリのすべての商品のすべてのプッチを表示するのは珍しいことです。

    関連する問題