休眠懒惰的解决方案。这样对吗?

时间:2009-04-24 05:43:06

标签: hibernate lazy-evaluation

我正在使用以下方法来解决hibernate中的延迟初始化问题。请告诉我它是否有效。由于某些原因,我必须在我的持久层强制实施我的交易。

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

这种方法对吗?可以有任何问题。

1 个答案:

答案 0 :(得分:0)

确保始终提交或回滚,然后始终关闭会话。基本上,您的资源(交易和会话)应该被释放,无论如何,例如,它们可以放在适当的finally块(在会话的情况下)或try和catch块(在事务的情况下)中。

一般来说,跨不同应用程序层的资源分配和释放是反模式的 - 如果你的架构强迫你应用反模式,那么在这里有更多的问题要问......例如,想想你应该做什么在你的“过滤器”中,如果会话恰好被关闭......