JAVA中nosession问题_解决noSession问题

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

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

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

with root cause

org.hibernate.HibernateException:No Session foundforcurrent 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

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

6f13960c7d69c565f3231ce9d20e2ef9.png

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

3.问题解决思路

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

OpenSessionInViewFilter

org.springframework.orm.hibernate5.support.OpenSessionInViewFilter

OpenSessionInViewFilter

*.action

c0b803c207ed4ffb3e058918cc7042b4.png

添加过滤器解决noSession分析图

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

方案二:

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

packagecn.xdf.dao.impl;

@Repositorypublic class CustomerDaoImpl implementsCustomerDao {

@AutowiredprivateHibernateTemplate hibernateTemplate;public voidsave(Customer customer) {

hibernateTemplate.save(customer);

}public ListfindAll() {return (List) hibernateTemplate.find("from Customer");

}public voiddelete(Customer customer) {

hibernateTemplate.delete(customer);

}//根据id立即加载

publicCustomer get(Long custId) {return hibernateTemplate.get(Customer.class, custId);

}//根据id延迟加载-->用该方法会有问题(页面报错:noSession)

public Customer load(Long custId) {

return hibernateTemplate.load(Customer.class, custId);

}public voidupdate(Customer customer) {

hibernateTemplate.update(customer);

}public ListfindByCriteria(DetachedCriteria dc) {return (List) hibernateTemplate.findByCriteria(dc);

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值