2009-04-24 11 views
0

私は以下のアプローチを使用して、休止状態での遅延初期化問題を解決しています。それがうまくいくかどうか教えてください。私はいくつかの理由から強制的に私の永続層に私の転写を実装する必要があります。休止状態の遅延ソリューション。そうですか?

public class CourseDAO { 

    Session session = null; 

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

    public Course findByID(int cid) { 
     Course crc = null; 
     Transaction tx = null; 
     try { 
      tx = session.beginTransaction(); 
      Query q = session.createQuery(
       "from Course as course where course.cid = "+cid+" " 
      ); 
      crc = (Course) q.uniqueResult(); 
      //note that i am not commiting my transcation here. 
      //Because If i do that i will not be able to do lazy fetch 
     } 
     catch (HibernateException e) { 
      e.printStackTrace(); 
      tx.rollback(); 
      throw new DataAccessLayerException(e); 
     } 
     finally { 
      return crc; 
     } 
    } 

} 

とフィルタで、私はfollingコード

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

を使用していますが、このアプローチの権利ですか?何か問題がありますか?

+0

http://community.jboss.org/wiki/OpenSessionInView – Bozho

答えて

0

常にコミットまたはロールバックしてから、セッションを常に閉じてください。基本的に、あなたのリソース(トランザクションとセッション)は、何に関係なく解放されるべきです。彼らは(トランザクションの場合)(セッションの場合)、またはその両方試してみて、キャッチブロックで適切ながfinallyブロックの内側に配置することができます。一般的な、割り当てと異なるアプリケーションのレイヤー全体のリソースを解放するには

はアンチパターンです - アンチパターンを適用するにあなたのアーキテクチャの力あなたが多くの質問が何をすべきと考えて、例えば...ここに依頼することがある場合セッションが閉じられた場合、あなたの "フィルタ"で行います...

+0

私は最終的にトランスクリプトを閉じるか、コミットできません。 LAzay初期化例外です。これは私がフェッチ怠惰にしようとしているためであると私は閉じるか、私は怠け者FETCにできるようにしたいセッションをコミットするので、私は(それが閉じていない場合)、フィルタでセッションを終了しようとしていた場合。 私のapporachは正しいですか?あなたのコメント – user93796

+0

ため Waithingあなたは正しい、最終的にはフィルタでいますか?そうでない場合、あなたのアプローチは正しくありません。そうすれば、あなたのアプローチは少なくとも実現可能です。とにかく私の答えはあなたの事件のために作られました。 – topchef