1,现象与问题

  1. /**
  2. * 由于Hibernate存在延迟加载问题,当Dao事务提交之后,session就关闭;
  3. * 此时如果到显示层就没有办法获取对象,使用openSessionInViewer是解决延迟加载的方案
  4. *
  5. * 解决思路:
  6. * 1,在表示层开启session * 需要在表示层获取Spring工厂,以此获取Hibernate的SessionFactory
  7. * 2,在dao层获取表示层的session * 如果希望在Dao层获取表示层的数据,应该将要获取的数据存储到ThreadLocal中
  8. * 3,当这个过程执行完毕之后再关闭session
  9. *
  10. * 需要使用Filter解决这个问题
  11. */

2, 步骤

创建一个SessionFilter类

  1. /**
  2. * 在过滤器初始化方法中进行Spring工厂,sessionFactory的初始化操作
  3. */
  4. public void init(FilterConfig cfg) throws ServletException {
  5. //这个是很重要的方法
  6. wac=WebApplicationContextUtils.getWebApplicationContext(cfg.getServletContext());
  7. sessionFactory=(SessionFactory) wac.getBean("sessionFactory");
  8. }

通过ThreadLocal处理session

  1. private static ThreadLocal<Session> sessionHolder= new ThreadLocal<Session>();
  2.  
  3. //setSession()方法只会在这个方法中使用
  4. private static void setSession(Session session){
  5. sessionHolder.set(session);
  6. }
  7. public static Session getSession(){
  8. return sessionHolder.get();
  9. }
  10. private static void removeSession(){
  11. sessionHolder.remove();
  12. }

在web.xml中配置该Filter

  1. <!-- 配置openSessionInViewFilter-->
  2. <filter>
  3. <filter-name>openSessionInViewFilter</filter-name>
  4. <filter-class>com.yangw.spring.filter.OpenSessionFilter</filter-class>
  5. </filter>
  6.  
  7. <filter-mapping>
  8. <filter-name>openSessionInViewFilter</filter-name>
  9. <url-pattern>/*</url-pattern>
  10. </filter-mapping>

比如在BaseDao中的使用

  1. public List<T> list(String hql, Object[] args) {
  2.  
  3. /**
  4. * 如果使用了自定的OpenSessionFilter,需要安装如下方式获取
  5. */
  6. Query query=OpenSessionFilter.getSession().createQuery(hql);
  7. //Query query=this.getSession().createQuery(hql);
  8. if(args!=null){
  9. for(int i=0;i<args.length;i++){
  10. query.setParameter(i, args[i]);
  11. }
  12.  
  13. }// return listToBean(query.list(),hql);
  14. return query.list();
  15. }

说了这么多,其实Spring就有OpenSessionInViewFilter ,我们只需要在web.xml中进行配置即可,代码中任何地方都不用作变化

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xmlns="http://java.sun.com/xml/ns/javaee"
  4. xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
  5. xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
  6. http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
  7.  
  8. <!-- 1,创建Spring的监听器-->
  9. <listener>
  10. <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  11. </listener>
  12. <!-- 2, Spring的监听器通过context-param获取beans.xml的位置-->
  13. <context-param>
  14. <param-name>contextConfigLocation</param-name>
  15. <param-value>classpath*:beans.xml</param-value>
  16. </context-param>
  17.  
  18. <!-- 配置openSessionInViewFilter-->
  19. <!-- 如果把这个Filter放到struts2之后,所有的请求都会被struts2所控制,这个Filter就不起作用,必须将这个Filter放到struts2之前 -->
  20. <!-- Spring提供了OpenSessionInViewFilter,我们在web.xml配置即可,以前代码怎么写还是怎么写,不需要任何变化-->
  21.  
  22. <filter>
  23. <filter-name>openSessionInViewFilter</filter-name>
  24. <filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>
  25. </filter>
  26.  
  27. <filter-mapping>
  28. <filter-name>openSessionInViewFilter</filter-name>
  29. <url-pattern>/*</url-pattern>
  30. </filter-mapping>
  31.  
  32. <!-- 3,配置struts2的过滤器-->
  33. <filter>
  34. <filter-name>struts2</filter-name>
  35. <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
  36. </filter>
  37.  
  38. <filter-mapping>
  39. <filter-name>struts2</filter-name>
  40. <url-pattern>/*</url-pattern>
  41. </filter-mapping>
  42.  
  43. </web-app>
  1. @SuppressWarnings("unchecked")
  2.  
  3. public List<T> list(String hql, Object[] args) {
  4.  
  5. //select * 的处理,可以利用反射来做
  6. /**
  7. * 如果使用了自定的OpenSessionFilter,需要安装如下方式获取
  8. */
  9. //Query query=OpenSessionFilter.getSession().createQuery(hql);
  10. /**
  11. * 如果使用Spring提供的OpenSessionFilter,代码不需要任何变化
  12. */
  13. Query query=this.getSession().createQuery(hql);
  14. if(args!=null){
  15. for(int i=0;i<args.length;i++){
  16. query.setParameter(i, args[i]);
  17. }
  18.  
  19. }// return listToBean(query.list(),hql);
  20. return query.list();
  21. }

Spring-Hibernate-web的延迟加载方案的更多相关文章

  1. 简要描述如何结合struts、hibernate、spring开发Web应用?

    简要描述如何结合struts.hibernate.spring开发Web应用? 解答:Struts可以将jsp页面的表单关联起来,就是把JSP页面的表单数据封装成javaBean,这样的话,在acti ...

  2. Struts2+Spring+Hibernate框架整合总结详细教程

    一.SSH三大框架知识总结 Struts 2是Struts的下一代产品,是在 struts 1和WebWork的技术基础上进行了合并的全新的Struts 2框架.其全新的Struts 2的体系结构与S ...

  3. SSH面试题(struts2+Spring+hibernate)

    struts2 + Spring +hibernate Hibernate工作原理及为什么要用?   原理:   1.读取并解析配置文件   2.读取并解析映射信息,创建SessionFactory ...

  4. Struts,spring,hibernate三大框架的面试

    Struts,spring,hibernate三大框架的面试 1.Hibernate工作原理及为什么要用? 原理: 1.读取并解析配置文件 2.读取并解析映射信息,创建SessionFactory 3 ...

  5. 用eclipse搭建SSH(struts+spring+hibernate)框架

    声明: 本文是个人对ssh框架的学习.理解而编辑出来的,可能有不足之处,请大家谅解,但希望能帮助到大家,一起探讨,一起学习! Struts + Spring + Hibernate三者各自的特点都是什 ...

  6. Spring,hibernate,struts的面试笔试题及答案

    Hibernate工作原理及为什么要用?  原理:  1.读取并解析配置文件  2.读取并解析映射信息,创建SessionFactory  3.打开Sesssion  4.创建事务Transation ...

  7. Spring MVC+Spring +Hibernate配置事务,但是事务不起作用

    最近做项目,被一个问题烦恼了很久.使用Spring MVC+Spring +Hibernate开发项目,在使用注解配置事务管理,刚开始发现无论如何数据库都无法更新,但是可以从数据库查询到数据.怀疑是配 ...

  8. spring+hibernate常见异常集合

    spring+hibernate出错小结: (1)java.lang.NoClassDefFoundError: org/hibernate/context/CurrentSessionContext ...

  9. Struts2+Spring+Hibernate 三大框架的合并集成

    这次来看看Struts2+Spring+Hibernate三大框架的整合应用,主要是Spring和Hibernate框架的整合,因为前边已经将Strtus2+Spring整合过了基本一样.  首先看一 ...

  10. Springmvc+Spring+Hibernate搭建方法

    Springmvc+Spring+Hibernate搭建方法及example 前面两篇文章,分别介绍了Springmvc和Spring的搭建方法,本文再搭建hibernate,并建立SSH最基本的代码 ...

随机推荐

  1. Centos定时任务

    安装crontab:yum install crontabs说明:/sbin/service crond start //启动服务/sbin/service crond stop //关闭服务/sbi ...

  2. zetcode :: First programs in PyQt5

    练习代码,详见网站 http://zetcode.com/gui/pyqt5/firstprograms/ import sys from PyQt5 import QtWidgets from Py ...

  3. mysql事件机制——定时任务

    定时任务是老生常谈了,因为我们总是需要定时修改特定的数据. 实现它的方法肯定不止一种,但我在相当长一段时间里都是用程序编码去做的,今天突然想到“为什么一定要采用调用的方式?”,用数据库自身的能力去实现 ...

  4. 迈向angularjs2系列(3):组件详解

    一: 以组件开发一个to-do list应用 todo组件分为导入.接口定义.顶层组件.控制器.启动5个部分. app.ts: //导入 import {Component} from '@angul ...

  5. Servlet使用简介

    Servlet的使用基本包含三个步骤: 1.继承HttpServlet 或实现Servlet 接口 (根据源码分析最终都是对servlet接口的实现) 2.配置地址: 配置web.xml 或者用注解的 ...

  6. docker 添加国内源

    docker for mac 获取地址:dao镜像地址  # 163的地址 https://hub-mirror.c.163.com docker for mac的设置操作:   点击Apply ...

  7. CVTE前端笔试编程题

    这些题目是做完笔试之后,在别的地方找到的,现在附上. 1.(1)这题考察的怎么把参数转换为数组,然后再截取你想要的位数. function C(){ var a_args=Array.prototyp ...

  8. CountDownLatch与CyclicBarrier

    对于AbstractQueuedSynchronizer衍生出来的并发工具类,这一篇再介绍俩. 场景1:有4个大文件的数据需要统计,最终将所有的统计结果进行加工,得到最后的分析数据.为了加速处理过程, ...

  9. Spring mvc 转发、重定向

    spring控制器最后返回一个ModelAndView(urlName),其中urNamel可以是一个视图名称,由视图解析器负责解析后将响应流写回客户端;也可以通过redirect/forward:u ...

  10. 字符编码笔记:ASCII,Unicode和UT…

    字符编码笔记:ASCII,Unicode和UTF-8 今天中午,我突然想搞清楚Unicode和UTF-8之间的关系,于是就开始在网上查资料. 结果,这个问题比我想象的复杂,从午饭后一直看到晚上9点,才 ...