返されたオブジェクトのメンバーであるbag/Collectionにアクセスしようとすると、「ロールのコレクションを遅延初期化できませんでした」という例外をスローする休止状態のDAOがあります。
例外をスローする問題の範囲を理解しています。Hibernateは私のオブジェクトを返し、コレクションの場合はプロキシオブジェクトを返します。呼び出し元で、これらのプロキシオブジェクトにアクセスしようとすると、休止状態のセッションが期限切れになったため、この例外がスローされます。
私が知りたいのは、アノテーションを使用してセッションが期限切れにならないようにするにはどうすればよいですか?出来ますか?
たとえば、私の呼び出しメソッドが次の場合:
@RequestMapping("refresh.url")
public ModelAndView refresh(HttpServletRequest request, HttpServletResponse response, int id) throws Exception {
TestObject myObj = testObjDao.get(id);
// throws the exception
myObj.getCollection();
アノテーションを使用してこの例外を防ぐにはどうすればよいですか?解決策の1つは、コールバックを介してHibernateセッションを拡張することです。これは、擬似コードでは次のようになります。
@RequestMapping("refresh.url")
public ModelAndView refresh(HttpServletRequest request, HttpServletResponse response, int id) throws Exception {
session = get hibernate session...
session.doInSession(new SessionCallback() {
TestObject myObj = testObjDao.get(id);
// no longer throws the exception
myObj.getCollection();
});
しかし、これは、コレクションにアクセスする必要のあるすべての関数に含まれているため、かなり繰り返しのようです。そこに@Transactionalアノテーションをたたくだけで、それを実行する方法はありませんか?のように:
@RequestMapping("refresh.url")
@Transactional // this doesn't extend the session to this method?
public ModelAndView refresh(HttpServletRequest request, HttpServletResponse response, int id) throws Exception {
TestObject myObj = testObjDao.get(id);
// throws the exception
myObj.getCollection();
これを私に説明するのにあなたの助けに感謝します。