8

私の問題は非常に単純ですが、Hibernate を希望どおりに動作させる方法がわかりません。MainTable は、ParentTable の 100 行のうち m=26 行を指します

@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "PARENT_ID")
@Fetch(FetchMode.JOIN)

「MainTableから」単純にクエリすると

26 + 1 クエリが生成されます

クエリをトレースすると、最初のクエリは 26 の後のクエリで使用される PARENT_ID のみをロードします。最初のクエリでPARENT_TABLE全体をロードする方法が必要だと思います..

次のように仮定してください。

  • FetchType.EAGER は必須です
  • MainTable mt left join fetch mt.parent parent からの使用は問題ありませんが、多くの関連付けがあります
4

1 に答える 1

4
 // Annotate ParentTable Persistance class file with a batch Size 
 @BatchSize(size=100)
 class ParentTable{
     ..
 }

@ManyToOne
@JoinColumn(name = "PARENT_ID")

これにより、クエリの数が n/100+1 減少します。

この問題の理由は、休止状態が内部的に遅延モードでデータをフェッチするためです (私は について話しているわけではありませんFetchMode.Lazy)。Lazy モードはFetchMode.SUBSELECT、コレクションにのみ適用される を使用して除外できます。に関しては、 を指定することで、データの@ManyToOneを選択できます。batchbatchSize

Fetch Startegies に関する簡単な説明

FetchMode.SUBSELECT

親に対して 1 つのクエリ、関連テーブルに対して 1 つのクエリ。Collections フレームワークにのみ適用されます。実行されたクエリは 2 つだけです。

FetchMode.SELECT

親には 1 つのクエリ、子には N クエリ。

FetchMode.JOIN

親の場合は 1 つのクエリ、子の場合は N クエリですが、データベースの取得は JOIN で事前に行われます。

FetchType.Batch

親の 1 つのクエリと、n/batchSize + 1 の起動されたクエリの数。


クエリを実行するタイミングに基づいて、フェッチには 2 つのタイプがあります。

FetchType.EAGER:

クエリは即座に起動されます。

FetchType.LAZY:

子オブジェクトがアクセスされると、クエリが起動されます。したがって、実行されるクエリの数は、アクセスされる子オブジェクトの数に依存します。

フェッチ戦略がどのように機能するかについては、こちらで詳しく説明しています

于 2014-08-13T13:48:49.893 に答える