日期:2014-05-18  浏览次数:20762 次

问一个hibernate的session问题
我用的是hibernate+spring,一个方法使用Criteria进行查询  
写了一个基础服务的实现,这个方法的代码如下  

/*通过一个po对象得到映射数据库的信息*/  
        public   Criteria   findAllByCriteria(final   Class   c)   {  
                return   (Criteria)   getHibernateTemplate().execute(new   HibernateCallback()   {  

                        public   Object   doInHibernate(Session   session)  
                                        throws   HibernateException   {  
                                Criteria   criteria   =   session.createCriteria(c);  
                                return   criteria;  
                        }  
                },   true);  
        }  
 

单元测试通过,但是通过监听在页面上实现这个方法就不行(其他方法通过监听就没有问题),报错是说Session   is   closed  
报错信息  

11:21:55,512   [http-8080-Processor25]   ERROR   StandardWrapperValve   :   Servlet.service()   for   servlet   jsp   threw   exception  
org.hibernate.SessionException:   Session   is   closed!  
        at   org.hibernate.impl.AbstractSessionImpl.errorIfClosed(AbstractSessionImpl.java:49)  
        at   org.hibernate.impl.SessionImpl.list(SessionImpl.java:1541)  
        at   org.hibernate.impl.CriteriaImpl.list(CriteriaImpl.java:283)  
 


排查了半天可能就是觉得这个findAllByCriteria方法里面Session的问题了...  
以前多表联查的时候也出现过这个Session   is   closed的问题,不过没有解决放弃掉了..如果不能直接从model层直接调用查询到页面.怎么才能实现呢??

Thanks   any   reply


------解决方案--------------------
应该是到执行jsp页面的时候hibernate的session已经关闭了
试试hibernate的一个jsp的filter,可以在jsp中也用hibernate session.


<filter>
<filter-name> hibernateFilter </filter-name>
<filter-class> org.springframework.orm.hibernate.support.OpenSessionInViewFilter </filter-class>
</filter>