7

熱心にロードされたコレクション (lazy="false" fetch="subselect") への関連付けをマッピングしています。クエリを実行するときに Hibernate を使用してプログラムでオフにするにはどうすればよいですか?

4

2 に答える 2

8

実際、それは逆であると考えられています。マッピングでオフにし、クエリで「フェッチ」を使用して特定のユースケースでアクティブにします。

それが Hibernate チームの見方です。プロパティの「フェッチなし」を指定するリクエストをHibernateで作成する方法はありません...

于 2009-09-03T10:52:55.990 に答える
0

歴史的な理由から、複数の 1 対多の依存関係の間で熱心なフェッチを行う状況がありました。何年にもわたって多くの場所がそれに依存するようになったため、オフにするのは困難でした. ただし、一部のケースでは、熱心なフェッチが妨げられていました。テーブル上の大きな選択ごとに、各オブジェクトのコレクションごとに数百の小さなサブクエリが生成されます。熱心なフェッチを実際にオーバーライドするのではなく、これを回避する方法を見つけましたが、私にとっては同じように便利です。すべてのサブフェッチを一度に実行する単一のクエリを作成するだけです。これにより、休止状態で依存関係グラフをウォークし、数百のクエリを生成する代わりに、データベースに対して 1 つの物理クエリが作成されます。

なので交換しました

Query q = session.createQuery("from Customer c");

Query q = session.createQuery("from Customer c " +
            "left join fetch c.vats v " +
            "left join fetch v.klMemos bk " +
            "left join fetch bk.ferryKlMemos");

1 人の顧客には多くの VAT 番号があり、1 つの VAT 番号には多くの klmemos があります。古い状況では、最初に顧客のみを取得し、休止状態で、依存する各コレクションを 1 つずつ取得し始めていました。2 番目のフォームは、すべてを 1 つのネイティブ クエリにロードし、hibernate は、オブジェクト キャッシュに熱心なコレクションを追加するために必要なものをすべて見つけます。それが誰かに役立つことを願っています。注: 熱心なフェッチを避けるようにする必要があると思います ;-)

于 2013-04-25T07:07:16.353 に答える