2016-08-18 9 views
0
  1. は、我々がFetchType.EAGERを使用しての棄権すべきいくつかのルールのセットを持っていますか?JPA:いつeager fetchingがStackOverflowErrorになるのですか?

  2. 私はJPAフレームワークの一部(例えば、Hibernateは)循環依存関係を解決する必要があることを聞きました。

    • フレームワークでリレーするのは危険にさらされていますか?
    • FetchType.EAGERと一緒にStackOverflowErrorを実行すると、フレームワーク内で常にバグが発生します(2つのテーブルに3つの行がある場合はどうなるでしょうか)。 FetchType.EAGERを避けるために
+1

すべてのJPAプロバイダは、巡回関係の熱心な負荷に対処できなければなりません。問題がある場合は、JPAプロバイダに対してバグを起こす必要があります。 –

+0

@NeilStockton、ありがとう!私はあなたの答えをここで参照しました:http://stackoverflow.com/a/39015294/3014866 –

答えて

1

一つの良い理由は、あなたが常に熱心(JOIN FETCHで)JPQLに手動でフェッチを有効にすることができますが、FetchType.EAGERを設定した場合は、遅延フェッチを有効にすることができないということです。

1

EAGER:

  • 便利な、しかし熱心遅い

  • 使用あなたの親クラスは常に準クラスを必要としています。

LAZY:

  • 以上のコードが、はるかに効率的

  • は基本的に遅延ローディングは、熱心な代替(パフォーマンス、リソースの使用)よりも多くの利点があります。特定の問題が発生しない限り、一般的にeagerフェッチ用に設定しないでください。

    • ドメインインスタンスを共有すると異なるのHibernateセッション(例えばHTTPセッションスコープにドメインクラスのインスタンスを入れて、そこからプロパティにアクセスする。 - などのユーザーなど)をaccross

    • あなたは確信していますインスタンスがフェッチされるたびに(またはほとんどの場合)特定のリレーションプロパティにアクセスしますが、eagerフェッチのためにこのリレーションをコンフィグレーションすることも意味があります。

例:関係者と私はPersonエンティティをロードするとき、私はあなたが怠惰に保つことができるようにすべての時間をアドレスフェッチする必要があることを、ここではその必要はありませんが アドレス。

結論

EAGERフェッチ戦略は、コードのにおいです。ほとんどの場合、長期的なパフォーマンス上の不利益を考慮することなく、単純化のために使用されます。フェッチ戦略は、エンティティマッピングの責任であってはなりません。それぞれのビジネスユースケースにはエンティティの負荷要件が異なるため、フェッチ戦略を個々のクエリに委任する必要があります。 グローバルフェッチプランでは、クエリごとにフェッチされるLAZYの関連付けのみを定義する必要があります。常に生成された問合せ戦略をチェックすることと組み合わせることで、問合せベースのフェッチ計画はアプリケーションのパフォーマンスを向上させ、コストを削減することができます。

+0

回答ありがとう、upvoited!しかし、質問は 'StackOverflowError'に関するものです。あなたはそれについて言及しなかった。 –

+0

ここであなたの答えを参照してください:http://stackoverflow.com/a/39015294/3014866 –

+0

ok thanx buddy .. – Gokul

関連する問題