0

IBM DB2 9.7 で Hibernate を使用しています。データベースは、Hibernate が生成した選択ステートメント リストが大きすぎる (多数の結合を含む) というエラーを返します。エラー コードは 840 です。これを修正するために何かできることはありますか? 生成された選択リストが非常に長いことは知っていますが、Hibernate を設定してそれをパーツなどに分割することはできますか?

編集:問題が少し大きいように見えるので、これを再開しました。そのため、 https: //hibernate.onjira.com/browse/ANN-140 に JIRA の問題 (現在は拒否されています) があります。

問題は、Hibernate Annotations では、結合戦略で識別子を追加できないことです。ただし、XML 構成はこれをサポートします。

Pavel は、上記のリンク ディスカッションで問題を次のように適切に述べています。

"It would be nice to see how the problem with the multiple joins is faced when the
 underlying DB has restriction on the number of joins one can execute in a single SQL?
For instance MySQL seems to allow only 31 joins. What happens if the class hierarchy
has more     than 31 sub-classes?"

上記はまさに私が抱えている問題です。私たちは注釈を使用しており、サブクラスはかなりの数であり、大量の結合が作成され、DB2 ステートメントが壊れています。

これについて何かコメントはありますか?私も直接的な解決策を見つけることができませんでした。

4

1 に答える 1

3

Hibernate には、Hibernate で生成された select ステートメントを最適化するためのフェッチ戦略がほとんどないため、可能な限り効率的です。フェッチ戦略はマッピング関係で宣言され、Hibernate が関連するコレクションとエンティティをフェッチする方法を定義します。

取得戦略 取得戦略は 4 つあります。

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

詳細な説明については、Hibernate のドキュメントを参照してください。

于 2012-10-10T07:17:36.597 に答える