質問

私は休止状態に遅延初期化の問題を解決するために、次のアプローチを使用しています。それが仕事をしたりしませんか教えてください。私は何らかの理由により私の永続性層にcompulsary私transcationを実装する必要があります。

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();

右このアプローチですか?それはどんな問題を抱えていることができます。

役に立ちましたか?

解決

あなたは常にコミットまたはロールバックして、常にあなたのセッションを閉じることを確認します。基本的には、あなたのリソース(トランザクションおよびセッション)が、例えば、どんな解放されるべきではありません彼らは(トランザクションの場合)(セッションの場合)、またはその両方試してみて、キャッチブロックで適切ながfinallyブロックの内側に配置することができます。

一般的には、割り当てと異なるアプリケーション層にわたってリソースの解放は、アンチパターンである - あなたのアーキテクチャの力あなたの場合アンチパターンを適用するに続いたとえば...ここに聞いて多くの質問があり、あなたは何をすべきかを考えますあなたの「フィルタ」のセッションが終了することが発生した場合...

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top