2011-08-01 12 views
3

プロジェクトでは、データベースからオブジェクトのリストを読み取る必要があります。オブジェクトタイプは、多くの関連オブジェクトで構成される大きなオブジェクトグラフです。データベース内のすべてのオブジェクトのリストを取得するためにselectクエリを実行すると、Hibernateは1つだけでなく45の追加クエリを実行します。それでも、オブジェクトは遅延ロードされているようです。Hibernate - 大きなオブジェクトグラフを効率的にフェッチする方法は?

私が必要とするのは、効率的にWHOLEオブジェクトのリストを読み込むことです。これを行う最善の方法は何でしょうか?

私が最初にフェッチ使用するのではと思ったが加わり非常に多くの団体と、これは本当の痛みになる可能性があります。もっと良い解決策はありますか?

+0

オブジェクトグラフ全体をロードするか、ルートレベルオブジェクトの一部のプロパティをロードする必要がありますか? – hvgotcodes

+0

オブジェクトグラフ全体。 – helpermethod

答えて

3

ジョインおよびキャッシュ(またはその組み合わせ)は、基本的にここでパフォーマンスを改善するための唯一の方法であるフェッチ。彼らがあなたのためにうまくいくかどうかは、あなたのエンティティがどのように見えているのか、それが何をしようとしているのかによって決まります。

キャッシングは、(理想的には不変の)インスタンスの(幾分)限られた数の多対一の依存性のために有用である - 例えば参照を参照してください。フェッチ・ジョインは、他のすべての1対1および多対1に対して使用できます。ネストされたコレクションを取得しようとすると、すぐにから手を出す。特定の場合には適用され

1つの追加のトリックは、あなたのクエリを実行する前に、セッションにプリロード(一部)怠惰な依存エンティティ(あなたは、彼らはもちろん、事前に何であるかを知っていれば)です。そうすれば、第2レベルのキャッシュのパフォーマンス/メモリの問題に対処する必要はありません。

あなたが言及した45個の追加のクエリがリストにエンティティあたりしている場合、あなたはおそらくトレードオフのどこかを確認する必要がありますし、キャッシュ/経由でロードされている他の人をさせるいくつかの依存関係を取得し、言ったことすべてその後の選択。

関連する問題