5

ネット上の hibernate fetch 戦略のリンクをいくつか調べました。私が気に入った簡潔で簡潔なリンクの 1 つは http://www.mkyong.com/hibernate/hibernate-fetching-strategies-examples/です。4 種類のフェッチ戦略があります。これらは :-

  1. fetch-”join” = 遅延読み込みを無効にし、常にすべてのコレクションとエンティティを読み込みます。
  2. fetch-”select” (デフォルト) = すべてのコレクションとエンティティを遅延ロードします。
  3. batch-size=”N” = 最大 'N' 個のコレクションまたはエンティティをフェッチします。記録しません
  4. fetch-”subselect” = コレクションをサブ select ステートメントにグループ化します。

私の最初の質問は、上記のどれが熱心なまたは遅延読み込みのフェッチ タイプに適していますか?

hibernate fetch 戦略について質問するために、Department クラスで以下のコード スニペットを検討しています。

  @OneToMany(mappedBy = "department", cascade = CascadeType.ALL, fetch = FetchType.EAGER,      orphanRemoval = true)
 @Fetch(value = FetchMode.SELECT)
 @BatchSize(size = 10)
 private Set<EmployeeData> employees = new HashSet<EmployeeData>();

私の理解によると、フェッチタイプを熱心に言及するとすぐに、結合フェッチ戦略のみが残りますが、フェッチタイプとしてレイジーロードと言及すると、他の3つのオプション、つまり選択、バッチサイズ、サブ選択があります。同意しましたか?私のレガシープロジェクトのコードスニペットを見ると、フェッチタイプが熱心で、フェッチ戦略が互いに矛盾する選択として言及されています。右?

もう 1 つのクエリは、FetchMode を書き込むときにバッチ サイズ オプションが表示されないことです。他の3つのフェッチ戦略が表示されますが、Eclipseでコントロール+スペースを実行しますか?

4

2 に答える 2

16

Hibernate コレクションには、フェッチ タイプとフェッチ モードの設定があります。

フェッチ タイプはコレクションの要素がいつ取得されるかを指定し、フェッチ モードはHibernate がそれらを取得する方法を指定します。

したがって、FetchMode.SELECTFetchMode.SUBSELECTは と の両方FetchType.EAGERで有効FetchType.LAZYです。違いは、コレクションへの最初のアクセス後に実行されるのFetchType.EAGERに対し、追加の選択クエリはすぐに実行されることです。FetchType.LAZY

FetchMode.JOINただし、 では意味がありませんFetchType.LAZY

バッチ サイズは の追加の最適化でFetchMode.SELECTあるため、独自の注釈 ( ) で構成する必要があり、列挙自体@BatchSizeとは関係ありません。FetchMode

以下も参照してください。

于 2012-01-23T11:39:02.843 に答える
0

batch-size=Nfetch=subselectとほぼ同じです。それがどのように行われるかを説明しましょう:

10000 個の親レコードがあり、それぞれに 500 個の子レコードがあるとします。サブセレクトとしてフェッチ戦略を使用するとクエリは次のようになります。

副選択:
親から * を選択します。
select * from child where child.Parent_Id in(親から Parent_Id を選択)。

注: IN 句が基になるデータベースによって提供される制限を超えた場合、上記のクエリは明らかに失敗します。これが、バッチサイズが登場する状況です。batch-sizeを使用することで、IN 句に参加する Parent_Id の数を指定できます。

Select & batch-size:
親から * を選択します。
select * from child where child.Parent_Id in(1,2,3,4......基になる DB の IN 句の制限まで)。
select * from child where child.Parent_Id in(1001,1002......基になる DB の IN 句の制限まで)。

注: batch-sizeはfetch=selectで使用する必要がありますが、fetch=subselectでは使用しないでください (意味がないため)。

于 2015-04-14T18:54:35.217 に答える