- 浏览: 3008695 次
- 性别:
- 来自: 河南
文章分类
- 全部博客 (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 26090(1) 输入参数为单个值 ... -
iBATIS与Hibernate的异同
2010-12-30 14:47 3711Hibernate Hibernate是一个开放源代 ... -
iBATIS与Spring整合
2010-12-30 14:34 4879接着iBATIS的入门实例来说,ibatis与Spring的 ... -
Hibernate温习(16)--性能优化之缓存管理
2010-11-11 16:02 17801.缓存概述 缓存(cache) ... -
Hibernate温习(15)--性能优化之抓取策略
2010-11-11 14:51 3522抓取策略(fetching strategy) 是指:当应 ... -
Hibernate温习(14)--性能优化之延迟加载机制
2010-11-11 11:33 1775延迟加载 延迟加载 ... -
Hibernate温习(13)--Hibernate程序性能优化的考虑要点
2010-11-11 10:55 1340本文依照HIBERNATE帮助文档,一些网络书籍及项目经 ... -
Hibernate温习(12)--基于注解方式的各种映射全面总结
2010-11-11 10:43 36001. 使用Hibernate Annotation来做对 ... -
Hibernate温习(11)--多事务并发访问控制
2010-11-11 10:25 7436在并发环境,一个数据库系统会同时为各种各样的客户程序 ... -
Hibernate温习(10)--应用程序中的事务管理
2010-11-11 09:26 1938事务的定义 事务就是指作为单个逻辑工作单元执行的一组数据操作 ... -
Hibernate温习(9)--有关Hibernate升级后注解方式的对象关系映射
2010-11-10 17:06 3340我要说的升级指的是我实际中遇到的,由于我之前的项目中Hiber ... -
Hibernate进行测试时时常会有的错误
2010-11-10 14:31 1501在hibernate程序中,如果使用JUNIT进行测试的话,第 ... -
Hibernate温习(8)--使用JPA
2010-11-10 11:00 2381这次讲的JPA前一篇文章都有所介绍,这里呢就是结合hibern ... -
Hibernate温习(7)--JPA回顾
2010-11-10 10:39 1978什么是JPA JPA(Java Pers ... -
Hibernate温习(6)--单向一对一外键关联映射
2010-11-05 10:24 2616hibernate一对一唯一外键关联映射(单向关联Citize ... -
Hibernate温习(5)--集合属性映射
2010-11-04 22:37 2450Hibernate的集合属性映射 ... -
Hibernate温习(3)--有关session的总结
2010-11-04 17:22 4239说到Hibernate那么最核心的就是它的有关数据库的增删改查 ... -
Hibernate温习(1)--最基础的示例
2010-11-04 14:22 3453有关Spring的知识大部分都已经温习完毕,今天开始转向Hib ... -
ibatis入门实例讲解
2010-10-25 10:39 12992之前大家上网的ibatis官方网站:http://www.i ... -
HIbernate温习(2)--连接池配置总结基于第三方c3p0和proxool
2010-07-26 14:42 3442一直都在用连接池技术,也是个好习惯,但用连接 ...
相关推荐
### Spring + Hibernate OpenSessionInView 模式的理解和应用 在Java Web开发中,Spring与Hibernate作为两个重要的框架,经常被一起使用来实现业务逻辑与数据持久化的处理。而在使用这两个框架时,为了更好地管理...
为了练手培训,给大家准备的 Open Session In View 的简单例子,纯代码,大家可以参考,其中主要说了六部分内容: 1.通过接口编程 2.通过spring注入dao到 action 3.通过 open session in view filter 支持 延迟加载...
**OpenSessionInView模式**是一种常用的Hibernate优化模式,其主要目的是解决Hibernate的一级缓存问题。通过这种方式,可以确保在一个HTTP请求的生命周期内,Hibernate的Session始终处于打开状态,从而避免了因...
同时,需要注意的是,OpenSessionInView模式虽然方便,但也会带来潜在的问题,如事务边界不清晰和会话泄漏。因此,在实际应用中,应结合具体需求谨慎使用,并考虑使用更现代的解决方案,如Spring Data JPA的...
- **OpenSessionInView**:是一种设计模式,用于Web应用中,通过过滤器在请求开始时打开`Session`,结束时关闭,确保整个请求过程中`Session`可用,从而支持延迟加载。但这种方法可能导致过多的数据库连接,因此也...
在Java Web开发中,OpenSessionInView(OSIV)模式是一种常见的解决数据持久化问题的设计模式,主要用于Spring框架与Hibernate等ORM工具的集成。这个模式的主要目的是解决在HTTP请求处理过程中,由于Session范围内的...
-- Hibernate OpenSessionInView 过滤器 --> <filter-name>hibernateFilter</filter-name> <filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class> <!-- ...
一,集成 Spring 与 Hibernate 1,配置SessionFactory 1,配置 ---------------------- applicationContext.xml ------------------------ <!-- 配置SessionFactory(整合Hibernate) --> ...
- **OpenSessionInView** 是Hibernate的一个重要概念,它允许在视图层打开一个Session,这样就可以在渲染视图的时候访问数据库。 - **get() 和 set() 方法** 用于对象属性的获取和设置,在文档中被用于封装实体类...
Hibernate的延迟加载与OpenSessionInView - **延迟加载**:在session范围内,仅在实际需要时加载关联对象的数据,提高性能。 - **OpenSessionInView**:在Web层通过Filter保持session的打开状态,直到请求结束,...
5. 延迟加载(Lazy Loading)和`openSessionInView`模式: - 延迟加载是在需要时才加载关联对象,确保只在session范围内加载,以提高性能。 - `openSessionInView`模式是在Web层使用Filter打开和关闭Session,确保...
Hibernate 的延迟加载与 openSessionInView - **延迟加载**:只在真正需要时才加载关联对象,以提高性能。 - **openSessionInView**:通过在 web 层设置一个 filter 来保持 session 打开状态,从而支持整个请求...
5. 如果使用OpenSessionInView模式,需要确保读写操作的Session分配正确。 在实际应用中,还需要考虑事务管理和异常处理,确保系统稳定性和数据一致性。同时,根据业务需求,可能还需要动态切换数据源,这通常通过...
Hibernate 的延迟加载和 openSessionInView 模式 - **延迟加载**:只在真正需要时才加载关联对象,从而提高应用程序性能。 - **openSessionInView**:通过在 Web 层添加一个 Filter 来维持 Session 的打开状态,...
OpenSessionInView(OSIV)模式是SSH整合中常见的一种优化策略,它在用户的一次HTTP请求过程中保持Hibernate Session,避免了多次打开和关闭Session,减少了N+1查询问题,提高了性能。 **Spring** 是一个全面的企业...
SSH框架是指Struts2、Spring、Hibernate这三种技术的组合,常被用于Java Web开发中。全注解配置相较于XML配置更加简洁,易于维护,因此在现代Web项目开发中越来越受到青睐。本文将详细介绍如何搭建一个基于全注解...
在Spring框架中,通常使用SessionFactory的OpenSessionInView模式,确保每个HTTP请求都有一个独立的Session。 4. **DAO和Service层设计**:在雇员管理系统中,Hibernate常被用作DAO(Data Access Object)层的技术...