Hibernate と Strutsを使用しています
休止状態で遅延読み込みを使用しています。
現在、JSP で遅延読み込みの例外に直面しています。他の解決策は EAGER を使用することですが、他のアプリケーションの Eager 依存関係に変更することはできません。
遅延読み込みの例外を制御する方法はありますか?
Hibernate と Strutsを使用しています
休止状態で遅延読み込みを使用しています。
現在、JSP で遅延読み込みの例外に直面しています。他の解決策は EAGER を使用することですが、他のアプリケーションの Eager 依存関係に変更することはできません。
遅延読み込みの例外を制御する方法はありますか?
デフォルトのロード戦略はLAZY
、関連付けられたコレクションにフェッチを使用することです。そして推奨される解決策は、実行時にコードでこのデフォルト戦略をオーバーライドすることにより、関連するコレクションをロードすることです。Query
とCriteria
インターフェイスの両方がこれをサポートしています。
たとえば、以下のエンティティ アソシエーション マッピングがあるとします。
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
クエリを使用して必要なグラフ全体を取得することをお勧めします。
遅延読み込みの例外を回避する一般的な方法は、フェッチ結合を使用することです。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()
ロードをトリガーするために呼び出すだけでは不十分であることに注意してください。実際には、読み込みをトリガーするために属性の値を必要とする操作を実行する必要があります。
意図をより明確に伝えるため、私は通常、最初のアプローチを好みます。