我使用下面的方法来解决在休眠延迟初始化的问题。请告诉我它是否会工作或没有。我要实现我的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();

时,这种做法对吗?它可以可具有任何问题。

有帮助吗?

解决方案

请确保您始终提交或回滚,然后总是关闭会话。基本上,你的资源(交易和会话)应该不管是什么,例如释放可以将它们放在合适的最后块的内部(在会话的情况下)或在两个try和catch块(在交易的情况下)。

在一般情况下,分配和跨不同应用层资源的释放是反模式 - 如果你的架构逼着你去申请反模式则有更多的问题要问这里...例如,想你应该做些什么在你的“过滤器”,如果会议恰好被关闭......

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top