- 浏览: 2990066 次
- 性别:
- 来自: 河南
文章分类
- 全部博客 (340)
- Java综合 (26)
- 程序人生 (53)
- RIA-ExtJS专栏 (18)
- RIA-mxGraph专栏 (4)
- RIA-Flex4专栏 (43)
- 框架-Spring专栏 (16)
- 框架-持久化专栏 (22)
- 框架-Struts2专栏 (11)
- 框架-Struts专栏 (12)
- SQL/NOSQL (12)
- 报表/图表 (2)
- 工作流 (5)
- XML专栏 (4)
- 日常报错解决方案 (5)
- Web前端-综合 (12)
- Web/JSP (14)
- Web前端-ajax专栏 (14)
- Web前端-JQuery专栏 (9)
- IDE技巧 (6)
- FILE/IO (14)
- 远程服务调用 (2)
- SSO单点登录 (2)
- 资源分享 (22)
- 云计算 (1)
- 项目管理 (3)
- php专栏 (1)
- Python专栏 (2)
- Linux (1)
- 缓存系统 (1)
- 队列服务器 (1)
- 网络编程 (0)
- Node.js (1)
最新评论
-
hui1989106a:
我的也不能解压,360和好压都试了,都不行
《Spring in Action》完整中文版分享下载 -
temotemo:
这些example有些过时了,官方建议使用HBase-1.0 ...
Java操作Hbase进行建表、删表以及对数据进行增删改查,条件查询 -
zy8102:
非常感谢~
HeadFirst系列之七:《深入浅出SQL》原版高清PDF电子书分享下载 -
zy8102:
重命名了一下搞定了
HeadFirst系列之七:《深入浅出SQL》原版高清PDF电子书分享下载 -
zy8102:
为什么下载以后老解压不了呢?
HeadFirst系列之七:《深入浅出SQL》原版高清PDF电子书分享下载
在WEB应用程序中,视图(JSP或Servlet)可能会通过导航从某个托管对象中拖出它的关联对象或集合数据,这些关联对象或集合数据如果是被延迟加载的(Hibernate本身就有几种默认延迟加载的情况,欲了解更多请看前面的文章),Hibernate就会抛出LazyInitializationException.因为没有持久化上下文存在时,是无法加载违背初始化的代理和集合的。
针对这个问题,Hibernate作者提出了OpenSessionInView模式作为解决方案,这个模式的主要思想是:
在用户的每一次请求过程始终保持一个持久化上下文打开着
OpenSessionInView模式的具体实现有以下三个步骤:
第一步:把Session绑定到当前线程上
要保证在一次请求中只有一个持久化上细纹,首先要把Session实例绑定到当前线程上,这需要在Hibernate的全局配置文件hibernate.cfg.xml中这样配置(其实就是前面关于Session文章的sf.getCurrentSession的一种配法)
<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<!--把session附加到当前线程上-->
<property name="hibernate.current_session_context_class">thread</property>
</session-factory>
</hibernate-configuration>
然后,在程序代码中获取Session实例时,使用SessionFactory的getCurrentSession()方法。这样,可以保证每一次请求的处理线程上只有一个持久化上下文实例的存在
第二步:用Filter过滤器在请求到达之前打开Session,在相应返回前关闭Session,代码如下
package com.javacrazyer.common;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
/*OSIV模式的Filter*/
public class OpenSessionInViewFilter implements Filter {
//这个之所以放在这里当成员变量因为它是线程安全的,严格的说,这个实例只能创建一次
private SessionFactory sf;
public void destroy() {
}
public void doFilter(ServletRequest arg0, ServletResponse arg1,
FilterChain arg2) throws IOException, ServletException {
Session sesion=null;
try {
//请求到达时,打开Session并启动事务
sesion=sf.getCurrentSession();
sesion.getTransaction().begin();
//执行请求处理链
arg2.doFilter(arg0, arg1);
//返回相应时,提交事务,关闭session
sesion.getTransaction().commit();
} catch (Exception e) {
//执行过程中,如果有异常,则必须回滚事务
if (sesion.getTransaction().isActive()) {
sesion.getTransaction().rollback();
}
}
}
public void init(FilterConfig arg0) throws ServletException {
sf=HibernateUtil.getSessionFactory();
}
}
这段代码在请求处理完毕之后,也就是提交事务之后,并没有书写关闭session的代码,这是因为当前使用的是SessionFactory的getCurrentSession()来获取实例的,在当前线程上的事务被提交或回滚时,当前Session会自动清除和关闭的。所以无需手工关闭
HibernateUtil如下
package com.javacrazyer.common;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.AnnotationConfiguration;
/**
* Hibernate工具类
*
*/
public class HibernateUtil {
private static final SessionFactory factory;
private HibernateUtil(){}
static{
//加载Hibernate全局配置文件,根据配置信息创建SessionFactory工厂实例
factory = new AnnotationConfiguration().configure().buildSessionFactory();
}
public static SessionFactory getSessionFactory(){
return factory;
}
/**
* 本方法用来获取当前线程上绑定的Session实例
* 注意hibernate全局配置文件中,如果使用是JDBC事务,添加如下配置:<br/>
* <property name="hibernate.current_session_context_class">thread</property>
* @return
*/
public static Session getSession(){
return factory.getCurrentSession();
}
}
第三步,在WEB应用的web.xml中配置Filter过滤器
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<!--OSIV的过滤器 -->
<filter>
<filter-name>osiv</filter-name>
<filter-class>com.javacrazyer.common.OpenSessionInViewFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>osiv</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
为了简单起见,本程序应用到了所有URL,在实际开发中,建议把它应用到执行期间需要操作数据库的URL上
发表评论
-
ibatis常用16条SQL语句
2011-07-29 11:08 26020(1) 输入参数为单个值 ... -
iBATIS与Hibernate的异同
2010-12-30 14:47 3665Hibernate Hibernate是一个开放源代 ... -
iBATIS与Spring整合
2010-12-30 14:34 4851接着iBATIS的入门实例来说,ibatis与Spring的 ... -
Hibernate温习(16)--性能优化之缓存管理
2010-11-11 16:02 17581.缓存概述 缓存(cache) ... -
Hibernate温习(15)--性能优化之抓取策略
2010-11-11 14:51 3489抓取策略(fetching strategy) 是指:当应 ... -
Hibernate温习(14)--性能优化之延迟加载机制
2010-11-11 11:33 1723延迟加载 延迟加载 ... -
Hibernate温习(13)--Hibernate程序性能优化的考虑要点
2010-11-11 10:55 1310本文依照HIBERNATE帮助文档,一些网络书籍及项目经 ... -
Hibernate温习(12)--基于注解方式的各种映射全面总结
2010-11-11 10:43 35691. 使用Hibernate Annotation来做对 ... -
Hibernate温习(11)--多事务并发访问控制
2010-11-11 10:25 7407在并发环境,一个数据库系统会同时为各种各样的客户程序 ... -
Hibernate温习(10)--应用程序中的事务管理
2010-11-11 09:26 1899事务的定义 事务就是指作为单个逻辑工作单元执行的一组数据操作 ... -
Hibernate温习(9)--有关Hibernate升级后注解方式的对象关系映射
2010-11-10 17:06 3301我要说的升级指的是我实际中遇到的,由于我之前的项目中Hiber ... -
Hibernate进行测试时时常会有的错误
2010-11-10 14:31 1451在hibernate程序中,如果使用JUNIT进行测试的话,第 ... -
Hibernate温习(8)--使用JPA
2010-11-10 11:00 2333这次讲的JPA前一篇文章都有所介绍,这里呢就是结合hibern ... -
Hibernate温习(7)--JPA回顾
2010-11-10 10:39 1944什么是JPA JPA(Java Pers ... -
Hibernate温习(6)--单向一对一外键关联映射
2010-11-05 10:24 2584hibernate一对一唯一外键关联映射(单向关联Citize ... -
Hibernate温习(5)--集合属性映射
2010-11-04 22:37 2420Hibernate的集合属性映射 ... -
Hibernate温习(3)--有关session的总结
2010-11-04 17:22 4209说到Hibernate那么最核心的就是它的有关数据库的增删改查 ... -
Hibernate温习(1)--最基础的示例
2010-11-04 14:22 3420有关Spring的知识大部分都已经温习完毕,今天开始转向Hib ... -
ibatis入门实例讲解
2010-10-25 10:39 12938之前大家上网的ibatis官方网站:http://www.i ... -
HIbernate温习(2)--连接池配置总结基于第三方c3p0和proxool
2010-07-26 14:42 3407一直都在用连接池技术,也是个好习惯,但用连接 ...
相关推荐
介绍Spring+hibernate opensessioninview问题
为了练手培训,给大家准备的 Open Session In View 的简单例子,纯代码,大家可以参考,其中主要说了六部分内容: 1.通过接口编程 2.通过spring注入dao到 action 3.通过 open session in view filter 支持 延迟加载...
一,集成 Spring 与 Hibernate 1,配置SessionFactory 1,配置 ---------------------- applicationContext.xml ------------------------ <!-- 配置SessionFactory(整合Hibernate) --> ...
NULL 博文链接:https://8366.iteye.com/blog/472141
OpenSessionInView项目整合jar包
Spring提供的CharacterEncoding和OpenSessionInView功能
SSH项目整合示例【OpenSessionInView】所用到的jar包 包含Struts + Hibernate + Spring所有jar及其依赖的jar
在没有使用Spring提供的Open Session In View情况下,因需要在service(or Dao)层里把session关闭,所以lazy loading 为true的话,要在应用层内把关系集合都初始化,如 company.getEmployees(),否则Hibernate抛...
最新版SSH项目整合 实现了OpenSessionInView。 hibernate5.2.3+struts2.5.2+spring4.3.3
NULL 博文链接:https://likenice.iteye.com/blog/290162
和Spring中OpenSessionInView由于org.springframework.web.struts.ContextLoaderPlugIn中保存同一个对象的名不同导致openSessionInView失效 稍微修改后在struts-config.xml中使用MyContextLoaderPlugIn.jar包中...
17.使用Spring的注解方式实现AOP入门 18.使用Spring的注解方式实现AOP的细节 19.使用Spring配置文件实现AOP 20.aspectj的切入点语法定义细节 21.搭建和配置Spring与jdbc整合的环境 22.Spring集成的jdbc编码和...
NULL 博文链接:https://yanzhenwei.iteye.com/blog/1701164
SSH项目整合示例【OpenSessionInView】源码
使用 AOC 拦截器而不是过滤器进行 OpenSessionInView 处理 列出一个国家的城市和添加城市的可能性(bean 验证和自动检索 lat 和 lng 坐标) 安全 安全的 REST Web 服务 使用 CSRF 令牌 角度父状态的问题 有用的链接 ...
Spring的Ioc Spring的AOP , AspectJ Spring的事务管理 , 三大框架的整合 目录 1.1 Spring 框架学习路线:..........................................................................................................