Hibernateを使っていてLazyInitializationExceptionで悩む
(())
((org.seasar.mayaa.impl.cycle.script.rhino.OffsetLineRhinoException: Wrapped org.hibernate.LazyInitializationException: could not initialize proxy - the owning Session was closed in script=
popup.popupUrl (/html/common/Popup.mayaa#write#4)))
の例外が発生。
参照できないオブジェクトへは、以下のような取得、リクエストスコープへの設定を行っていた。
基底クラス
↑継承
サブクラス
サブクラスで、Hibernateのセッション作成
データベースへのアクセスしオブジェクトを取得←まだSQLが発行されない?
リクエストスコープへオブジェクトをセット
基底クラスでHibernateセッションを閉じる
プレゼンテーション層で、オブジェクトを取得←ここで例外。セッションを閉じなければ、ここでSQLが遅延実行される。
基底クラスでHibernateのセッションを閉じてしまうのが、原因らしいけど。。
フィルターでトランザクションの開始、トランザクションの終了、セッションを閉じる処理を行えば良いのか。
うーん、ちょっと悩んで、そもそも遅延ロードっていらなくない?
という気が。
パフォーマンスを向上させるHibernateの特徴のひとつらしいが、
実装中、これが問題になってはまることが多くて、Hibernateに慣れてる人ならあたりまえのことでも、毎回はまってしまう。
で、
問題のテーブルのマッピングファイルのclass要素に、lazy="false"を設定。
例外は、解決された。