19

LAZYを使用してHQLでオーバーライドすることが可能LEFT JOIN FETCHです。

FROM Obj AS obj LEFT JOIN FETCH obj.otherObj WHERE obj.id = :id

オーバーライドすることも可能EAGERですか?どのように?

4

2 に答える 2

8

歴史的な理由から、複数の 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:11:21.087 に答える
4

Hibernate Docsからのこのスニペットの修飾子は、怠惰なものを熱心にオーバーライドできることを意味しますが、その逆はできません。

プロパティレベルの遅延フェッチ(バイトコードインストルメンテーションを使用)を使用している場合は、fetch all propertyを使用して、最初のクエリでHibernateにレイジープロパティをすぐにフェッチさせることができます。

異常なことに、CriteriaAPIを使用して熱心なものから怠惰なものに移行することができるように見えます。setFetchMode(FetchMode.LAZY)関連する参加を呼びかけるだけです。

于 2010-06-18T20:19:59.047 に答える