近日重温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之类,我只想知道这个答案,这是一种很好的设计模式。
用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之类,我只想知道这个答案,这是一种很好的设计模式。
Session session = HibernateSessionFactory.getSession();打开;
HibernateSessionFactory.closeSession();关闭 ;
另外,需要注意的是:如果你更新一个对象,而且没有关闭session,接着又在当前会话的JSP中查询并使用了刚刚更新的数据的话,查询出来的数据是脏数据,相当于session没有close,事务没有来得及提交。
的确可以在filter中关闭,但hibernate没提倡这么做啊,也没这么做啊,myeclipse生成的dao确实没关闭啊,从没调用HibernateSessionFactory.closeSession(); 它是想在什么地方关闭呢? 不能只管打开,不管关闭啊
myeclipse生成代码的时候你最好仔细看看他生成的SessionFactory 你大约就能明白他为什么没有关闭Session的操作了(注意ThreadLocal)顺带一提 自动生成代码只是为了方便你快速开发 没人告诉你生成的代码可以直接就用的
8楼说getSession,会自动关闭,怎么个自动关闭法呢? 这正是我所求的。