1,现象与问题

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

2, 步骤

创建一个SessionFilter类

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

通过ThreadLocal处理session

private static ThreadLocal<Session> sessionHolder= new ThreadLocal<Session>();

    //setSession()方法只会在这个方法中使用
    private static void setSession(Session session){
        sessionHolder.set(session);
    }
    public static Session getSession(){
        return sessionHolder.get();
    }
    private static void removeSession(){
        sessionHolder.remove();
    }

在web.xml中配置该Filter

    <!-- 配置openSessionInViewFilter-->
    <filter>
        <filter-name>openSessionInViewFilter</filter-name>
        <filter-class>com.yangw.spring.filter.OpenSessionFilter</filter-class>
    </filter>

    <filter-mapping>
        <filter-name>openSessionInViewFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

比如在BaseDao中的使用

      public List<T> list(String hql, Object[] args) {

        /**
         * 如果使用了自定的OpenSessionFilter,需要安装如下方式获取
         */
        Query query=OpenSessionFilter.getSession().createQuery(hql);
        //Query query=this.getSession().createQuery(hql);
        if(args!=null){
            for(int i=0;i<args.length;i++){
                query.setParameter(i, args[i]);
            }

        }//    return listToBean(query.list(),hql);
        return query.list();
    }

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

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xmlns="http://java.sun.com/xml/ns/javaee"
         xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
         http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">

     <!-- 1,创建Spring的监听器-->
     <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
    <!-- 2, Spring的监听器通过context-param获取beans.xml的位置-->
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath*:beans.xml</param-value>
    </context-param>

    <!-- 配置openSessionInViewFilter-->
    <!-- 如果把这个Filter放到struts2之后,所有的请求都会被struts2所控制,这个Filter就不起作用,必须将这个Filter放到struts2之前 -->
    <!-- Spring提供了OpenSessionInViewFilter,我们在web.xml配置即可,以前代码怎么写还是怎么写,不需要任何变化-->

    <filter>
        <filter-name>openSessionInViewFilter</filter-name>
        <filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>
    </filter>

    <filter-mapping>
        <filter-name>openSessionInViewFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

    <!-- 3,配置struts2的过滤器-->
    <filter>
        <filter-name>struts2</filter-name>
        <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
    </filter>

    <filter-mapping>
        <filter-name>struts2</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

</web-app>
    @SuppressWarnings("unchecked")

    public List<T> list(String hql, Object[] args) {

        //select * 的处理,可以利用反射来做
        /**
         * 如果使用了自定的OpenSessionFilter,需要安装如下方式获取
         */
        //Query query=OpenSessionFilter.getSession().createQuery(hql);
        /**
         * 如果使用Spring提供的OpenSessionFilter,代码不需要任何变化
         */
        Query query=this.getSession().createQuery(hql);
        if(args!=null){
            for(int i=0;i<args.length;i++){
                query.setParameter(i, args[i]);
            }

        }//    return listToBean(query.list(),hql);
        return query.list();
    }

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. TensorFlow学习笔记3——变量共享

    因为最近在研究生成对抗网络GAN,在读别人的代码时发现了 with tf.variable_scope(self.name_scope_conv, reuse = reuse): 这样一条语句,查阅官 ...

  2. iOS app 的 ASLR

    这两天逆向一个程序,发现每次image list -o -f 之后,它的基地址都是0x00000,也就是偏移地址是0.  想到这个应该是载入内存时有没有启用偏移有关,于是找了下答案:aslr 百度百科 ...

  3. 一篇文章学会Spring4.0

    spring概述 spring 是一个开源框架. Spring 为简化企业级应用开发而生. 使用 Spring 可以使简单的 JavaBean 实现以前只有 EJB 才能实现的功能. Spring 是 ...

  4. SpringMVC详解(六)------与json交互

    Json(JavaScript Object Notation),它是一种轻量级数据交换格式,格式简单,易于读写,目前使用特别广泛.那么这篇博客我们主要谈谈在 SpringMVC 中,如何对 json ...

  5. winform WebBrowser控件中,cs后台代码执行动态生成的js

    很多文章都是好介绍C# 后台cs和js如何交互,cs调用js方法(js方法必须是页面上存在的,已经定义好的),js调用cs方法, 但如果想用cs里面执行动态生成的js代码,如何实现呢? 思路大致是这样 ...

  6. python+selenium自动化软件测试(第13章):selenium面试题

    前言最近看到群里有小伙伴贴出一组面试题,最近又是跳槽黄金季节,小编忍不住抽出一点时间总结了下 一.selenium中如何判断元素是否存在?expected_conditions模块提供了16种判断方法 ...

  7. redis集群搭建及注意事项

    上一篇:redis的安装及注意事项 这里,在一个Linux虚拟机上搭建6个节点的redis伪集群,思路很简单,一台虚拟机上开启6个redis实例,每个redis实例有自己的端口.这样的话,相当于模拟出 ...

  8. 【DDD】领域驱动设计精要

    本文算是<领域驱动设计>这本书的读书笔记,加上自己的一些读后感.网上有很多这本书的读书笔记,但是都是别人的,不如自己总结的理解深刻.建议大家在读这本书时结合<实现领域驱动设计> ...

  9. 【javascript】谈谈HTML5 ——HTML兽进化, H5兽!

    作为一名Web开发者,可能你并没有对这个“H5”这个字眼投入太多的关注,但实际上它早已不知不觉进入到你的开发中,并且总有一天会让你不得不正视它,了解它并运用它   打个比方:<海贼王>中的 ...

  10. spring mvc:注解@ModelAttribute妙用

    在Spring mvc中,注解@ModelAttribute是一个非常常用的注解,其功能主要在两方面: 运用在参数上,会将客户端传递过来的参数按名称注入到指定对象中,并且会将这个对象自动加入Model ...