- はい、
@BatchSize
怠惰な関連付けで使用することを目的としています。 - Hibernateは、初期化されていないプロキシ/コレクションの数が指定されたバッチサイズより少ない場合でも、ほとんどの状況で複数のステートメントを実行します。詳細については、この回答を参照してください。また、小さいクエリと比較して軽いクエリは、システムの全体的なスループットにプラスの影響を与える可能性があります。
-
@BatchSize
クラスレベルでは、エンティティに指定されたバッチサイズがすべての@*ToOne
に適用されることを意味します そのエンティティとの怠惰な関連付け。Person
の例を参照してください ドキュメント内のエンティティ。
あなたが提供したリンクされた質問/回答は、一般的に最適化と遅延読み込みの必要性についてより懸念しています。もちろん、ここでも適用されますが、バッチロードのみに関連しているわけではありません。これは可能なアプローチの1つにすぎません。
もう1つの重要なことは、リンクされた回答に記載されているイーガーローディングに関連しており、プロパティが常に使用されている場合は、イーガーローディングを使用することでパフォーマンスが向上する可能性があることを示唆しています。これは一般的に真実ではありません コレクションの場合、および多くの状況で1対1の関連付けの場合もあります。
たとえば、bs
のエンティティが次のようになっているとします。 およびcs
常に A
の場合に使用されます 使用されます。
public class A {
@OneToMany
private Collection<B> bs;
@OneToMany
private Collection<C> cs;
}
bs
を熱心に読み込んでいます およびcs
単一のクエリでそれらを結合しない場合、明らかにN+1選択の問題に悩まされます。ただし、たとえば次のように、それらを1つのクエリに結合する場合:
select a from A
left join fetch a.bs
left join fetch a.cs
次に、完全なデカルト積を作成します bs
の間 およびcs
count(a.bs) x count(a.cs)
を返します 各a
の結果セットの行 これらは1つずつ読み取られ、A
のエンティティにアセンブルされます。 およびそれらのbs
のコレクション およびcs
。
最初にA
を読み取るため、この状況ではバッチフェッチが非常に最適です。 s、次にbs
次にcs
、結果としてクエリが増えますが、データベースから転送されるデータの総量ははるかに少なくなります。また、個別のクエリは、結合を使用する大きなクエリよりもはるかに単純であり、データベースの実行と最適化が容易です。