休止状態の怠惰なソリューション。正しいですか?

hibernate lazy-evaluation

私は休止状態で遅延初期化問題を解決するために次のアプローチを使用しています。 うまくいくかどうか教えてください。 私はいくつかの理由で私のパーシスタンスレイヤの強制的に私のトランザクションを実装する必要があります。

パブリッククラスCourseDAO {

セッションsession = null。

public CourseDAO(){session = HibernateUtil.getSessionFactory()。getCurrentSession(); }

公開コースfindByID(int cid){コースcrc = null;トランザクションtx = null。 {tx = session.beginTransaction();を試してください。クエリq = session.createQuery( "コースとしてコースからcourse.cid =" cid ""); crc =(コース)q.uniqueResult(); //私はここで私のトランザクションをコミットしていないことに注意してください。 //そうだとすれば私は遅延フェッチを行うことができなくなります} catch(HibernateException e){e.printStackTrace();} tx.rollback();新しいDataAccessLayerException(e)をスローします。 }最後に{return crc; }}

}

フィルタで私は以下のコードを使用しています

session = HibernateUtil.getSessionFactory()。getCurrentSession(); if(session.isOpen())session.getTransaction()。commit();

このアプローチは正しいですか? 問題ないでしょうか。

  0  0


ベストアンサー

必ずコミットまたはロールバックしてから、必ずセッションを閉じてください。 基本的に、あなたのリソース(トランザクションとセッション)は何に関係なく解放されるべきです。 それらは適切なfinallyブロックの内側(セッションの場合)、またはtryブロックとcatchブロックの両方(トランザクションの場合)に配置できます。

一般的に、異なるアプリケーション層にわたるリソースの割り当てと解放はアンチパターンです – あなたのアーキテクチャがアンチパターンを適用することを強要するならば、ここで尋ねるべきより多くの質問があります…​ たとえば、セッションが閉じられた場合に「フィルタ」で何をすべきかを考えてください。

0


タイトルとURLをコピーしました