Spring-Hibernate-web的延迟加载方案
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的延迟加载方案的更多相关文章
- 简要描述如何结合struts、hibernate、spring开发Web应用?
简要描述如何结合struts.hibernate.spring开发Web应用? 解答:Struts可以将jsp页面的表单关联起来,就是把JSP页面的表单数据封装成javaBean,这样的话,在acti ...
- Struts2+Spring+Hibernate框架整合总结详细教程
一.SSH三大框架知识总结 Struts 2是Struts的下一代产品,是在 struts 1和WebWork的技术基础上进行了合并的全新的Struts 2框架.其全新的Struts 2的体系结构与S ...
- SSH面试题(struts2+Spring+hibernate)
struts2 + Spring +hibernate Hibernate工作原理及为什么要用? 原理: 1.读取并解析配置文件 2.读取并解析映射信息,创建SessionFactory ...
- Struts,spring,hibernate三大框架的面试
Struts,spring,hibernate三大框架的面试 1.Hibernate工作原理及为什么要用? 原理: 1.读取并解析配置文件 2.读取并解析映射信息,创建SessionFactory 3 ...
- 用eclipse搭建SSH(struts+spring+hibernate)框架
声明: 本文是个人对ssh框架的学习.理解而编辑出来的,可能有不足之处,请大家谅解,但希望能帮助到大家,一起探讨,一起学习! Struts + Spring + Hibernate三者各自的特点都是什 ...
- Spring,hibernate,struts的面试笔试题及答案
Hibernate工作原理及为什么要用? 原理: 1.读取并解析配置文件 2.读取并解析映射信息,创建SessionFactory 3.打开Sesssion 4.创建事务Transation ...
- Spring MVC+Spring +Hibernate配置事务,但是事务不起作用
最近做项目,被一个问题烦恼了很久.使用Spring MVC+Spring +Hibernate开发项目,在使用注解配置事务管理,刚开始发现无论如何数据库都无法更新,但是可以从数据库查询到数据.怀疑是配 ...
- spring+hibernate常见异常集合
spring+hibernate出错小结: (1)java.lang.NoClassDefFoundError: org/hibernate/context/CurrentSessionContext ...
- Struts2+Spring+Hibernate 三大框架的合并集成
这次来看看Struts2+Spring+Hibernate三大框架的整合应用,主要是Spring和Hibernate框架的整合,因为前边已经将Strtus2+Spring整合过了基本一样. 首先看一 ...
- Springmvc+Spring+Hibernate搭建方法
Springmvc+Spring+Hibernate搭建方法及example 前面两篇文章,分别介绍了Springmvc和Spring的搭建方法,本文再搭建hibernate,并建立SSH最基本的代码 ...
随机推荐
- 复杂JSON反序列化为类对象
有3种常用的反序列化库,gson和fastjson都很棒,json-lib有很大的局限性不推荐使用! 1. net.sf.json(json-lib) 只能用于解析简单的JSON,稍微复杂点的例如,类 ...
- centos7使用无线wifi连接
一:所用命令 dmesg | grep firmware(看看有没有来自无线网卡的固件请求) iw: iw dev(查找无线网卡口) iw wls1 link(查看wls1网口无线网络连接情况) iw ...
- javaScript系列:JSON详解
JSON详解 JSON的全称是”JavaScript Object Notation”,意思是JavaScript对象表示法,它是一种基于文本,独立于语言的轻量级数据交换格式.XML也是一种数据交 ...
- return 的返回值与结束功能
前言:大家好~我是阿飞~在js中return是很重要的基础.一定要彻底掌握理解它哦.否则js学习到中后期很容易懵逼的+_+ 什么是return? 1.在js中return是一个表达式语句,如果后面什么 ...
- Java基础---其他对象
第一讲 System类 一.概述 1.System是描述系统一些信息的类,类中的属性和方法都是静态的.不能被实例化,没有提供构造函数. 2.字段摘要 out:标准输出流.默认是控制台. in: ...
- Vue双向数据绑定原理解析
基本原理 Vue.采用数据劫持结合发布者-订阅者模式的方式,通过Object.defineProperty()来劫持各个属性的setter和getter,数据变动时发布消息给订阅者,触发相应函数的回调 ...
- 在Centos7x上部署docker
docker只支持CentOS7.x系统,所以近期根据docker官网指南自己搭建了一套,供大家参考. 1.部署Centos7.x系统,查看系统版本. 2.执行 sudo yum update 更新到 ...
- jQuery插件——ajax
一.ajax请求 1.load(url, [data], [callback]) 概述:加载远程的HTML文件代码,并插入到指定的DOM节点中. 参数:url:待装入 HTML 网页网址. data: ...
- 换个角度审视NAT技术
NAT (Network address translation,网络地址转换 )是局域网连接到互联网的一个对接工作. 首先要知道NAT是一个技术或者说软件而不是协议 后面你会知道NAT 是偏应用层但 ...
- 个人作业3——个人总结(Alpha阶段)
Deadline: 2017-5-15 22:00PM,以博客发表日期为准 评分基准: 按时交 - 有分,检查的项目个人总结内容 晚交 - 0分 迟交一周以上 - 倒扣本次作业分数 抄袭 - 倒扣本次 ...