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 块中(在事务的情况下)。

一般来说,跨不同应用层的资源分配和释放是反模式的——如果你的架构迫使你应用反模式,那么这里还有更多问题要问......例如,想想你应该在你的“过滤器”如果会话碰巧被关闭...

于 2009-04-24T06:58:54.003 回答