0

Hibernate と Strutsを使用しています

休止状態で遅延読み込みを使用しています。

現在、JSP で遅延読み込みの例外に直面しています。他の解決策は EAGER を使用することですが、他のアプリケーションの Eager 依存関係に変更することはできません。

遅延読み込みの例外を制御する方法はありますか?

4

3 に答える 3

1

デフォルトのロード戦略はLAZY、関連付けられたコレクションにフェッチを使用することです。そして推奨される解決策は、実行時にコードでこのデフォルト戦略をオーバーライドすることにより、関連するコレクションをロードすることです。QueryCriteriaインターフェイスの両方がこれをサポートしています。

たとえば、以下のエンティティ アソシエーション マッピングがあるとします。

public class XEntity {
...
private Set<YEntity> yentities;
}
}

次に、Queryインターフェースを使用して、関連付けられyentitiesた を とともにフェッチできますXEntity

String xSelect = "select x from XEntity "
                + "x left join fetch x.yentities "
                + "where x.xName=:xname";
Query query = session.createQuery(xSelect);

インターフェイスをCriteria使用すると、これは次のように実行できます。

Criteria criteria = session.createCriteria(XEntity.class);
criteria.setFetchMode("yentities", FetchMode.JOIN);

これら 2 つの両方とも、1 回の選択で、関連付けられている と をフェッチしyentitiesますXEntity

Hibernate#initializeを使用してコレクションを初期化することもできます。

XEntity xentity = (XEntity) session.get(XEntity.class, id);
Hibernate.initialize(xentity.getYentities());
tx.commit();
session.close();

HQLただし、最初にorCriteriaクエリを使用して必要なグラフ全体を取得することをお勧めします。

于 2013-11-10T15:24:41.753 に答える
0

遅延読み込みの例外を回避する一般的な方法は、フェッチ結合を使用することです。Employee遅延ロードされた属性を持つエンティティがある場合projects、次のようにクエリを書き直します。

SELECT e FROM Employee e
LEFT JOIN FETCH e.projects

ここでa を使用して、LEFT JOINプロジェクトの有無にかかわらず、すべての従業員を取得することをお勧めします。simpleJOIN FETCHは内部結合になり、プロジェクトを持つ従業員のみが返されます。

遅延ロードされた属性のロードをトリガーする別のあまり明示的でない方法は、トランザクションがコミットされる前に属性にアクセスすることです。

tx.begin(); // for illustration, also works for container managed transactions  
...
Employee emp = // get the employee
emp.getProjects().size();
...
tx.commit();

emp.getProjects()ロードをトリガーするために呼び出すだけでは不十分であることに注意してください。実際には、読み込みをトリガーするために属性の値を必要とする操作を実行する必要があります。

意図をより明確に伝えるため、私は通常、最初のアプローチを好みます。

于 2013-11-10T14:57:19.923 に答える