9

私はいくつかの古いコードで奇妙なことを見つけました(少なくとも私にとっては)。

注釈が付けられているフィールドに@ManyToOneも。が注釈として付けられ@BatchSizeます。

アノテーションは、クラスレベルまたはコレクション( )@BatchSizeでアノテーションが付けられた場合にのみ影響し、反復する場合はプリフェッチに影響すると常に考えていました。@OneToMany

しかし、おそらく私は間違っていて、注釈@ManyToOneを付けると@BatchSize何かに影響します。ドキュメントに答えが見つかりません。

注釈@ManyToOneを付けることに@BatchSizeは意味がありますか?

4

3 に答える 3

18

質問は、同じ分野での組み合わせ@ManyToOneに言及していると思います。例:@BatchSize

@ManyToOne
@BatchSize(size = 5)
private User owner;

このユースケースは、少なくともアノテーションを使用する場合、Hibernateではサポートされていません。ドキュメントに記載されているバッチフェッチの唯一の使用法は次のとおりです。

  • コレクションフィールド、すなわち、@OneToManyまたは@ManyToManyただし @ManyToOne
  • フェッチするエンティティクラスについて

例えば:

@Entity
@BatchSize(size = 5)
public class User {
  ...
}

この後者の場合、多対1の関係を含む、タイプUserのすべての関係のバッチ処理が可能になります。ただし、エンティティクラスの注釈を使用すると、フィールドごとに動作を制御することはできません。

のすべての使用法についてHibernateソースコードを検索する@BatchSizeと、使用法がサポートされていないことが確認されます。AnnotationBinder.javaにあるものから、@BatchSizeアノテーションはエンティティクラスとある種の@XxxToManyアノテーションを持つフィールドでのみ検査されます。

于 2013-12-20T12:09:52.853 に答える
6

@ManyToOneに関連付けられているのは、対応するフィールドが( )@BatchSizeとしてマークされている場合にのみ意味があります。lazylazy=true

実際、フィールドがそうでない場合lazy、それは、囲んでいるエンティティがロードされているため、定義上すでにロードされているため、データベース呼び出しの問題は当てはまりません。

Person要素のコレクションShoesPairShoesPair.class)があり、その中に怠惰とマークされたフィールドが存在するクラスを想像してみてくださいowner(オプションであり、特定の靴のペアを取得するときに重要な情報を実際にもたらさないため)。

所有者を取得するために、 25足の靴(25のオブジェクト)を反復処理したいと考えています。ShoesPair

ownerフィールド(1人に対応)にのみ注釈が付けられている場合、データベースへの選択@ManyToOne25になります。

ただし、で注釈を付けると、呼び出しは5回@BatchSize(size=5)だけになるため、パフォーマンスが向上します。

Hibernateのドキュメントから、バッチサイズはコレクションだけに適用されるわけではないことが正確に示されています。

コレクションのバッチフェッチを有効にすることもできます。

Hibenateは、特に@OneToManyケースについて言及しています。これらのケースは、ケースの90%で。とマークされているフィールドに適用されるためlazyです。

于 2012-10-24T12:01:54.563 に答える
-1

HibernateでN+1クエリの問題を解決する

1fetchModeでのCriteriaクエリの使用

基準基準=session.createCriteria(Customer.class); 基準.setFetchMode( "連絡先"、FetchMode.EAGER);

2HOLフェッチ参加

3 @BatchSize

@BatchSizeアノテーションを使用して、単一のデータベースクエリに入力する同一の関連付けの数を定義できます。セッションに100人の顧客が接続されており、「contact」コレクションのマッピングにサイズnの@BatchSizeの注釈が付けられている場合。つまり、Hibernateが遅延連絡先コレクションにデータを入力する必要がある場合は常にセッションをチェックし、連絡先コレクションに入力する必要のある顧客がさらにいる場合は、最大n個のコレクションをフェッチします。

@OneToMany(mappedBy="customer",cascade=CascadeType.ALL, fetch=FetchType.LAZY)
    @BatchSize(size=25)
    private Set<Contact> contacts = new HashSet<Contact>();
于 2017-07-25T12:46:18.250 に答える