2013-06-26 20 views
14

私はセッションの外で遅延ロードオブジェクト/ colletionを使用することを知っていますが、Hibernate.initialize(Object obj)を実行して、initialize()メソッドの引数として渡されたオブジェクトが初期化され、セッション。Hibernate.initialize()の仕組み

しかし、私はこれがどのように機能するのか理解できません。私たちがやっているなら、私たちは熱心なフェッチをしてしまうので、なぜコンフィギュレーションに怠けて、ランタイム中に熱心なフェッチに終わるのですか?

つまり、私はHibernate.initialize()eagerlyというオブジェクトをロードすることの違いを知りたいと思います。

私は間違っているか何かを見逃しましたか?

答えて

27

違いはアプリケーションの範囲にあります。

コレクションアソシエーションを遅延させる理由は、実際には不要な場合に、親オブジェクトがロードされるたびにコレクションを読み込まないようにするためです。

通常はコレクションを遅延ロードしていて、特定の用途に使用する場合は、セッションが閉じられる前にコレクションがロードされていることを確認する必要があります。Hibernate.initialize(Object obj)を使用します。

実際にの場合、常ににコレクションがロードされる必要がある場合は、実際に読み込む必要があります。しかし、ほとんどのソフトウェアではそうではありません。

2

@Don Rubyは

次差分答える検討は、Hibernate.initialize、データをフェッチするための追加のSQLを生成して実行することです。したがって、セッションが閉じられた後に使用することができます。エンティティでEagerフェッチを使用すると、データベース内の(接続セッションの下で)データを検索している間は常にそのコレクションをフェッチしますが、その後はフェッチしません。

1

実際にEAGERを使用している場合、大きなコレクションがある場合、実際にパフォーマンスに影響します。したがって、このような状況ではHibernate.initializeを使用することをお勧めします。

は、このを見てみましょう:私はそれの内部の様々な分野を持っているエンティティ(この場合には非常に重いものである)loanApplicationなど(これを持って

Hibernate Lazy Fetch vs Eager Fetch Type

+1

セッション外でアクセスするコレクションがあり、Hibernate.initializeだけを実行すると、メンバーにアクセスするときに素晴らしいLazyInitializationExceptionが発生します。 –

4

を次の例を考えてみましょうまた大きいかもしれない)。たとえばLoanApplicationのSubLoanフィールドを考えてみましょう。

この例ではFetchTypeがLAZYです。いくつかの操作をしている間にコントローラのメソッドでLoanApplicationが発生すると、subLoansセットは使用しない限り最初はnullになります。その場合は、次のようなのHibernate.initializeを使用:あなたはloanApplicationなど、オブジェクトの大きなセット、すなわち「subLoan」を取得するたびに、あなたが本当にそれを望んでいたしない限り、最初は空になりますので、

Hibernate.initialize(loanApplication.getSubLoans()); 

これは主に、パフォーマンスを向上させることができます。

0

他の4つのテーブルとリレーションを持つ可能性のあるテーブルがあるとします。この場合、eagerを使用すると、関連するすべての4つのテーブルのすべての対応関係がフェッチ操作ごとにフェッチされます。

しかし、関連するテーブルの中の1つのテーブルのデータだけが必要な場合があります。この場合、関連するテーブルの4つのデータ全体をHibernate.initializeファシリティ。