在视图中休眠打开会话

时间:2009-04-23 15:29:24

标签: java hibernate lazy-loading

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

public class CourseDAO {

       Session session = null;
    public CourseDAO()
{

  this.session =    this.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())
          HibernateUtil.getSessionFactory().getCurrentSession().getTransaction().commit();

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

2 个答案:

答案 0 :(得分:0)

你能解释为什么你需要在你的存储库中拥有你的交易吗?问题在于它们会变得如此精细,所以你不会从会话缓存中获得任何好处

然后你在那里打开交易,但在你的过滤器中关闭它。如果您在服务中访问多个存储库会发生什么?也许我不理解你的意思,但我认为你需要重新考虑迫使你管理你的存储库中的交易的原因

答案 1 :(得分:0)

你什么时候创建CourseDAO?如果它是一个单独的bean或其他比页面视图更长的东西,它将需要保留一个SessionFactory并在需要时创建一个新的Session而不是保持一个Session。