web-dev-qa-db-ja.com

JPAのエンティティグラフのFETCHとLOADの違いは何ですか?

私はJPAを初めて使い、エンティティグラフを使用しようとしています。そして、データを取得するときに、使用するEntityGraphTypeを指定する必要があることに気付きました。

JPA2.1仕様を読みましたが、これら2つのオプションを適切に使用する方法がわかりません...

質問は...

  • 特定の要件がない場合、どのオプションを使用すればよいですか?
  • フェッチとロードを使用する必要がある特定の状況は何ですか?
27
Naga

最初に、質問の2番目の部分に答えます。

フェッチとロードを使用する必要がある特定の状況は何ですか?

JPAにエンティティをロードするには、eagerloadingとlazyの2つの主要な方法があります。 -)読み込み中。一括読み込みでは、エンティティはその親が読み込まれたときにすぐに読み込まれます。遅延読み込みでは、エンティティは、そのエンティティの実際のゲッターが呼び出されたときにのみ読み込まれます。パフォーマンスの高いアプリケーションは、アプリケーションの起動時にエンドユーザーがテーブル全体またはテーブルのグループさえもロードするのを待つのがあまりよくないため、遅延ロードに偏る傾向があります。次の質問に移ります。

エンティティを含むファイルに_javax.persistence.fetchgraph_をインポートして、戦略としてFETCHを指定します。この場合、エンティティグラフで指定されたすべての属性は_FetchType.EAGER_として扱われ、指定されたすべての属性notは_FetchType.LAZY_。一方、_javax.persistence.loadgraph_をインポートしてLOADを戦略として指定すると、エンティティグラフで指定されたすべての属性も_FetchType.EAGER_になりますが、指定されていない属性は指定されたタイプまたはデフォルトを使用します(エンティティで何も指定されていない場合)。

特定の要件がない場合、どのオプションを使用すればよいですか?

とはいえ、特定の要件がないということはほとんどありません。少なくとも、Webアプリケーションを高速で実行する必要があります。このため、おそらく遅延読み込みをデフォルトにする必要があります。 FETCHグラフの使用は、属性を熱心にロードする必要があると考えるいくつかの特殊なケースでは、デフォルトで遅延ロードexceptになるため、適切なオプションです。

これは 素晴らしいブログへのリンク であり、コードサンプルとともに、このすべてを詳細に説明しています。

35
Tim Biegeleisen