近日重温hibernate发现一个问题
用hibernate时,myeclipse反向工程可以自动生成一部分代码,生成的dao为什么没有关闭session呢?
如下时自动生成的dao中的一个方法(普通dao,非spring dao):
-------------------------------------------------------------------------------------------
public void save(Xwb11ComponentUsergroups transientInstance) {
log.debug("saving Xwb11ComponentUsergroups instance");
try {
getSession().save(transientInstance);
log.debug("save successful");
} catch (RuntimeException re) {
log.error("save failed", re);
throw re;
}
}-------------------------------------------------------------------------------------------
getSession()取当前线程中的session对象,这个session怎么来的我很清楚,但为什么不关闭呢? 或者说在哪里关闭的呢?请高手指点迷津。不要说用spring之类,我只想知道这个答案,这是一种很好的设计模式。

解决方案 »

  1.   

    hibernate;你要 是把事务提交后session就缓存就给清楚掉!它对jdbc已经封装了;
    Session session = HibernateSessionFactory.getSession();打开;
    HibernateSessionFactory.closeSession();关闭 ;
      

  2.   

    要自己调用关闭方法,自己调用myeclipse生成的HibernateSessionFactory.closeSession();方法,关闭的最好方式是自己做个优先级很高的过滤器,过滤首先不做任何处理,等dofilter完成后,再调用HibernateSessionFactory.closeSession();方法,这样就可以关闭,不要在这之前关闭。因为你JSP里的${}很有可能会用到hibernate查询的数据对象,如果你要访问这些数据对象的惰性属性的话,就不能在JSP访问完成前关闭session.
    另外,需要注意的是:如果你更新一个对象,而且没有关闭session,接着又在当前会话的JSP中查询并使用了刚刚更新的数据的话,查询出来的数据是脏数据,相当于session没有close,事务没有来得及提交。
      

  3.   

    支持4楼的说法,如果在每个方法里面都打开执行然后关闭,那也连接打开的也太频繁了。
    的确可以在filter中关闭,但hibernate没提倡这么做啊,也没这么做啊,myeclipse生成的dao确实没关闭啊,从没调用HibernateSessionFactory.closeSession();  它是想在什么地方关闭呢? 不能只管打开,不管关闭啊
      

  4.   

    "hibernate没提倡这么做啊",hibernate也没提倡不这么做,关于应用的东西,怎么好用怎么用,在Filter中关闭是最好的办法,在Spring里面session交给Spring代理,原理也是Filter.
      

  5.   


    myeclipse生成代码的时候你最好仔细看看他生成的SessionFactory 你大约就能明白他为什么没有关闭Session的操作了(注意ThreadLocal)顺带一提 自动生成代码只是为了方便你快速开发 没人告诉你生成的代码可以直接就用的
      

  6.   

    getSession 不需要你手动关闭 hibernate会自动关闭 openSession 需要你手动关闭
      

  7.   

    .....Myeclipse生成的SessionFactory会为每个线程创建一个Session至于会不会自动关闭那倒是不太清楚 
      

  8.   

    ThreadLocal我很清楚的理解。这个session的关闭没有直接关系。
    8楼说getSession,会自动关闭,怎么个自动关闭法呢? 这正是我所求的。
      

  9.   

    呵呵,我一般不自动生成dao文件,我的dao一直都是自己写的,那些基本的方法我都是写在一个父类里面,然后让dao继承,没有特殊要求的dao继承之后,不用写任何方法了