解决hibernate报错:no-session的问题-创新互联

1.问题描述:对于根据id查询时,在dao通过load方式查询对象时,加载页面会报 noSession异常。

义县网站制作公司哪家好,找成都创新互联!从网页设计、网站建设、微信开发、APP开发、成都响应式网站建设公司等网站项目制作,到程序开发,运营维护。成都创新互联成立与2013年到现在10年的时间,我们拥有了丰富的建站经验和运维经验,来保证我们的工作的顺利进行。专注于网站建设就选成都创新互联

解决hibernate报错:no-session的问题

 严重: Servlet.service() for servlet [springDispatcherServlet] in context with path [/Xxxx] threw exception 

[Request processing failed; nested exception is org.hibernate.HibernateException: No Session found for current thread] 

with root cause
org.hibernate.HibernateException: No Session found for current thread
    at org.springframework.orm.hibernate4.SpringSessionContext.currentSession(SpringSessionContext.java:106)
    at org.hibernate.internal.SessionFactoryImpl.getCurrentSession(SessionFactoryImpl.java:988)
    at com.vincent.videosys.dao.BaseDao.getSession(BaseDao.java:17)
    at com.vincent.videosys.dao.UserDao.usernameExist(UserDao.java:29)
    at com.vincent.videosys.service.UserService.usernameExistService(UserService.java:19)
    at com.vincent.videosys.controller.home.UserController.usernameExist(UserController.java:40)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at org.springframework.web.method.support.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:214)
    at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:132)
    at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle

解决hibernate报错:no-session的问题

2.问题分析:当使用hibernate框架操作数据库的时候,如果做查询的话会有立即加载(get)和延迟加载(load)的区别,延迟加载表示,当你查询某个数据(假设是对象)的时候,hibernate不会立马发送sql语句,而是当我们调用这个对象的属性的时候,也就是真正使用查询出来的数据的时候才会发送sql语句去一级缓存(即session,这里的session和域对象session没有半毛钱关系)中获取,但是正常这个session的开启核关闭是在service层执行的,但是我们真正使用查询的对象的数据时,是在web层,但是这个时候session已经关闭,就会报no-session异常。

解决hibernate报错:no-session的问题

noSession分析图(右键"查看图像"查看原图)

3.问题解决思路

方案一:让session的关闭时间要在web层使用完之后。 但是web层已经是最后一层了,怎么办?还有比web更后的东西哦,就是过滤器, 所以在web.xml中配置开启和关闭session的过滤器即可 ,但是要配在struts的过滤器之前,否则无效。

解决hibernate报错:no-session的问题


    OpenSessionInViewFilter
    org.springframework.orm.hibernate5.support.OpenSessionInViewFilter


    OpenSessionInViewFilter
    *.action

解决hibernate报错:no-session的问题

解决hibernate报错:no-session的问题

添加过滤器解决noSession分析图

使用load方法的解决方案 : 就是把原CustomerService层的绑定的session对象 提取配置到前面的 过滤器中了。

方案二:

    load改用get立即加载方式查询对象。

解决hibernate报错:no-session的问题

package cn.xdf.dao.impl;
@Repositorypublic class CustomerDaoImpl implements CustomerDao {

    @Autowired    
    rivate HibernateTemplate hibernateTemplate;    
    public void save(Customer customer) {
        hibernateTemplate.save(customer);}   
    public List findAll() {        
           return (List) hibernateTemplate.find("from Customer"); }   
    public void delete(Customer customer) {
        hibernateTemplate.delete(customer);}    //根据id立即加载
      public Customer get(Long custId) {        
            return hibernateTemplate.get(Customer.class, custId);}    //根据id延迟加载-->用该方法会有问题(页面报错:noSession)
      public Customer load(Long custId) {  
        return hibernateTemplate.load(Customer.class, custId);}  
      public void update(Customer customer) {
        hibernateTemplate.update(customer);}    
    public List findByCriteria(DetachedCriteria dc) {       
         return (List) hibernateTemplate.findByCriteria(dc);}
}

另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。


文章名称:解决hibernate报错:no-session的问题-创新互联
分享地址:http://myzitong.com/article/deeojo.html