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;
        }
    }

}

フィルターでは、次のコードを使用しています

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

このアプローチは正しいですか?問題が発生する可能性があります。

4

1 に答える 1

0

常にコミットまたはロールバックしてから、常にセッションを閉じるようにしてください。基本的に、リソース (トランザクションとセッション) は何があっても解放する必要があります。たとえば、適切な finally ブロック (セッションの場合) または try と catch ブロックの両方 (トランザクションの場合) に配置できます。

一般に、異なるアプリケーション レイヤー間でのリソースの割り当てと解放はアンチパターンです。アーキテクチャによってアンチパターンの適用が強制される場合は、ここでさらに質問する必要があります...たとえば、" filter」セッションが閉じられた場合...

于 2009-04-24T06:58:54.003 に答える