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最基本的代码 ...
随机推荐
- synchronized VS Lock, wait-notify VS Condition
最近在看Java Threads第三版,收获颇多.全英文阅读,感觉真的是爽歪歪.推荐大家都看看. 这一篇想系统的讲一讲,线程之间通信的2种模式,wait-notify 和 Condition. 先上一 ...
- 【Maven】 install:install-file
install jar to local fs mvn .jar -DgroupId=com.bonc -DartifactId=licenseVerify-.jar -Dversion= -Dpac ...
- 再起航,我的学习笔记之JavaScript设计模式14(桥接模式)
桥接模式 桥接模式(Bridge): 在系统沿着多个维度变化的同时,又不增加其复杂度并已达到解耦 从定义上看桥接模式的定义十分难以理解,那么我们来通过示例来演示什么是桥接模式. 现在我们需要做一个导航 ...
- 手机自带输入法emoji表情的输入,提交及显示——纯前端解决方案
很早之前就遇到过需要前端支持用户输入并提交emoji表情的问题,一直没有尝试去解决,今天再一次狭路相逢,该来的躲不过,那就着手解决吧. 大多数emoji表情都是4字节的utf-16编码(辅助平面字符, ...
- CODE大全给你推荐几个免费的leapftp 注册码
leapftp 2.7.6 注册码, Name: Kmos/CiA in 1999 s/n: MOD1-MO2D-M3OD-NOPQ LeapFTP2.7.5 注册名:swzn 注册码:214065- ...
- vue.js基础知识篇(1):简介、数据绑定
目录第一章:vue.js是什么? 第二章:数据绑定第三章:指令第四章:计算属性第五章:表单控件绑定代码链接: http://pan.baidu.com/s/1qXCfzRI 密码: 5j79 第一章: ...
- jdbc hibernate myBatis比较
jdbc hibernate myBatis比较 jdbc 优点:性能高,易掌握 缺点:代码繁琐 hibernate 优点:不用写sql,代码简洁 缺点:性能不好 自动生成的sql效率低下(复杂业务) ...
- js学习--变量作用域和作用域链
作为一名菜鸟的我,每天学点的感觉还是不错的.今天学习闭包的过程中看到作用域与作用域链这两个概念,我觉得作为一名有追求的小白,有必要详细了解下. 变量的作用域 就js变量而言,有全局变量和局部变量.这里 ...
- px,em,rem,vw单位在网页和移动端的应用
px: 是网页设计中最常用的单位,然而1px到底是多大长,恐怕没有人能回答上来 它用来表示屏幕设备物理上能显示的最小的一个点,这个点不是固定宽度的,不同设备上点的长度.比例有可能会不同. 假设:你现在 ...
- Go数组、切片、映射的原理--简明解析
数组.切片.映射是Golang的最重要的数据结构,下面是对这3种数据结构的一点个人总结: 一.数组 数组是切片和映射的基础数据结构. 数组是一个长度固定的数据类型,存储着一段具有相同数据类型元素的连续 ...