3

私は休止状態を学習しており、デバッガーを使用して休止状態がオブジェクトをフェッチする方法を理解しています。XMLで遅延読み込みを有効にし、クエリの作成を使用してオブジェクトを取得しました。このオブジェクトには、セットが関連付けられています。

デバッガーで変数値を見ると、オブジェクトグラフが完全に読み込まれているようです。つまり、セットとそのプロパティを遅延フェッチしていません。これが当てはまる理由はいくつか考えられます。

1)xml / configに問題があり、熱心なフェッチを有効にしています。これが当てはまるかどうかはわかりませんが、すべてがデフォルトでレイジーフェッチになっています。

2)IDEデバッガーが機能する方法は、休止状態がそれらを見るときに遅延読み込みをトリガーすることです。

3)Hibernateは、オブジェクトグラフ全体を第2レベルのキャッシュからフェッチしています。これを無効にしようとしましたが、効果がないようです

他のアイデアはありますか?

4

2 に答える 2

6

デバッグ (正確には、遅延フィールドを表示する) は、遅延読み込みを既にトリガーしています。エンティティを取得し、デタッチして、遅延フィールドにアクセスします。遅延読み込みが機能する場合は、何らかの例外をスローする必要があります。

休止状態がどのように機能するかを本当に知りたい場合は、ソースを見てください。

于 2013-02-20T16:47:16.687 に答える
3

@atamanromanの答えは完全に正しいです。詳細を追加したかっただけです。JavaEE 環境で遅延読み込みをテストするために、Arquillian テストを使用します。テスト クラスでは、 a を使用しUserTransactionてトランザクション境界を制御します。トランザクションをコミットした後、遅延読み込み属性にアクセスし、Exception

@Inject
private UserTransaction tx;

@Test(expected=Exception.class)
public void testLazyLoading() throws Exception {

    tx.begin();
    MyEntity entity = em.find(entityId);
    tx.commit();

    entity.getLazyLoadedProperty().someMethod();
} 

遅延読み込みされた属性の読み込みをトリガーするには、多くの場合、トランザクション内で getter を呼び出すだけでは不十分であることに注意してくださいsize()。リストの呼び出しなど、属性を使用して何らかの操作を実行する必要もあります。それ以外の場合、ゲッターは単にプロキシを返します。

于 2013-02-21T09:41:02.450 に答える