Hibernate的强大之处之一是懒加载功能,可以有效的降低数据库访问次数和内存使用量。但用的不好就会出现org.hibernate.LazyInitializationException。
这个异常出现的原因很简单,主要时在加载懒数据时Session已经关闭造成的,如下图:
那么OK,我们来考虑怎么解决吧。
我们只要在渲染JSP之前不要关闭Session,而在JSP渲染之后再关闭就OK啊。我们知道,在JSP/Servlet中,可以配置过滤器来实现这种功能。
我们考虑两种情况的解决方案: 单使用Hibernate和用Spring来管理Hibernate。
1. 单使用Hibernate:
我们可以自己写一个过滤器:
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.SessionFactory;
import org.hibernate.StaleObjectStateException;
import org.sunxin.struts2.util.hibernate.HibernateUtil;
public class HibernateThreadFilter implements Filter
{
private SessionFactory sf=null;
public void init(FilterConfig arg0) throws ServletException
{
sf=HibernateUtil.getSessionFactory();
}
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException
{
try
{
sf.getCurrentSession().beginTransaction();
chain.doFilter(request, response);
sf.getCurrentSession().getTransaction().commit();
}
catch (StaleObjectStateException staleEx)
{
throw staleEx;
}
catch (Throwable ex)
{
ex.printStackTrace();
try
{
//如果发生异常,让事务回滚。
if (sf.getCurrentSession().getTransaction().isActive())
{
sf.getCurrentSession().getTransaction().rollback();
}
}
catch (Throwable rbEx)
{
System.err.println(rbEx.toString());
}
}
}
public void destroy(){}
}
在web.xml中加入这个Filter的配置:
<filter>
<filter-name>HibernateThreadFilter</filter-name>
<filter-class>org.sunxin.struts2.filter.HibernateThreadFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>HibernateThreadFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
这样就在访问后台代码之前打开session,访问后台代码之后关闭session。
2. 用Spring管理Hibernate:
I . Spring为我们提供了这样一个过滤器,我们这样配置一下就OK。
在web.xml中加入Filter的配置:
<filter>
<description>处理Hibernate的懒加载问题</description>
<filter-name>openSessionInViewFilter</filter-name>
<filter-class>
org.springframework.orm.hibernate3.support.OpenSessionInViewFilter
</filter-class>
<init-param>
<description>
默认情况下,这个Filter会在Spring的bean池中找一个叫做sessionFactory的bean。如果使用了其他名字的SessionFactory,则应该在这里
指定这个名字。
</description>
<param-name>sessionFactoryBeanName</param-name>
<param-value>sessionFactory</param-value>
</init-param>
<init-param>
<description></description>
<param-name>singleSession</param-name>
<param-value>true</param-value>
</init-param>
</filter>
II . 同时Spring还为我们提供了另一种方案,就是使用拦截器,但偶还不太知道怎么配的,配的没有成功。还有这里需要用到spring-mvc.jar,不在spring.jar里面。还听说这个使用这个拦截器会有一些bug,偶现在也不知道到底是怎么个情况,有高人请指点。
转载地址:http://tuoxie007.iteye.com/blog/334853
分享到:
相关推荐
《Xilinx KCU105开发板及其设计资源详解》 Xilinx的KCU105开发板是一款基于高性能FPGA——KU040芯片的综合开发平台,深受硬件开发者和系统工程师的喜爱。该开发板提供了丰富的接口和功能,为用户在设计、验证和实现...
CP105维修工具是针对CP 105B设备的专业设定和维修程序,它为工厂技术人员提供了便利的诊断和修复功能。CP105B是一款广泛应用的工业级设备,可能涉及自动化、数据通信或其他复杂系统集成。在这个压缩包文件中,包含的...
STM8S105K4单片机最小系统开发板PDF原理图+库软件例程+STM8中文手册及相关文档资料合集: IAR105例程 STM8A%3a汽车电子MCU方案.pdf STM8S105K4T6原理图.pdf STM8S105K4库例程 STM8S105xxx中文数据手册.pdf STM8S_...
FC105是一款在工业自动化领域中广泛应用的功能模块,主要用于处理模拟量输入信号,如1~5V或4~20mA的标准电信号。这些信号通常来自传感器或变送器,用于表示连续的过程变量,如温度、压力、液位等。在本文中,我们将...
这个压缩包包含的资料对于STM8S系列的开发至关重要,特别是对STM8S105这款微控制器的初学者和专业开发者来说,提供了宝贵的编程和调试资源。 STM8S库函数版本是STMicroelectronics(意法半导体)为STM8系列微控制器...
STM8S105是一款由STMicroelectronics生产的8位微控制器,属于STM8系列。它在许多嵌入式系统设计中被广泛应用,特别是在需要高效能和低功耗的场合。这个压缩包包含的是一个关于STM8S105单片机的USART(通用同步/异步...
STM8S105是一款由STMicroelectronics推出的8位微控制器,属于STM8系列,具有高性能、低功耗的特点。这个实验例程主要是利用STM8S105单片机进行动态数码管显示,这对于理解和掌握微控制器在硬件驱动和数字显示方面的...
STM8S105系列单片机是一款基于STM8内核的8位微控制器,广泛应用于各种嵌入式系统和智能设备中。该系列产品的特点包括支持高达32K字节的Flash程序存储器,以及最多1K字节的EEPROM数据存储器,具有较好的数据保持能力...
STM32F105是意法半导体(STMicroelectronics)推出的一款基于ARM Cortex-M3内核的微控制器,广泛应用于工业控制、汽车电子、物联网设备等领域。在本例程中,重点涉及了两个主要的通信接口:CAN(Controller Area ...
《安桥 MD-105X迷你光碟录音机使用指南》 一、产品概览与特点 安桥MD-105X是一款先进的迷你光碟(MiniDisc)录音机,具备多项专业功能,旨在为用户提供高质量的音频录制与播放体验。在购买此设备后,用户应仔细阅读...
KCU105原理图文件涉及Xilinx公司生产的Kintex UltraScale系列FPGA开发平台——KCU105,它是一个评估平台,用于Kintex UltraScale KCU040系列FPGA的开发。原理图是电子工程中极其重要的文档,它详细描述了硬件电路的...
CCNA Routing and Switching Practice Tests: Exam 100-105, Exam 200-105, and Exam 200-125 by Jon Buhagiar English | 10 Mar. 2017 | ASIN: B06XKQBT63 | 504 Pages | AZW3 | 12.44 MB Preview exam day with ...
标题中的"libaio-0.3.105-i386.rpm"是一个Linux操作系统下的软件包,属于libaio库的一个版本,用于提供异步I/O支持。libaio,全称Library for Asynchronous Input/Output,是Linux内核提供的一种用户空间直接与硬件...
《Linux系统中libaio-0.3.105的安装与应用》 在Linux操作系统中,libaio(Linux Asynchronous I/O)库扮演着至关重要的角色,它为应用程序提供了一种异步I/O操作的方式,允许程序在等待I/O操作完成时继续执行其他...
《维宏NK105G2厂商手册-R6》是一份详细阐述维宏公司NK105G2控制器技术规格、功能特性和操作指南的重要参考资料。这份手册主要针对使用该控制器的用户,包括制造商、工程师和技术人员,为他们提供全面的技术支持和...
SSW105是星宸科技(SigmaStar)推出的一款专为物联网(IoT)设计的高性能Wi-Fi芯片,其特点在于低功耗和高效能。这款芯片在DTM3模式下,待机电流仅为150uA,这一指标在行业中处于领先地位,与TI、MTK和Cypress等知名...
斑马(Zebra)105SL系列打印机是一款广泛应用于工业级条形码和标签打印的设备,因其坚固耐用和高效性能而备受青睐。然而,在初次使用时,有些用户可能会遇到一个问题:打印机默认可能不支持中文字符打印,这给需要中文...
chrome浏览器最新版本,版本 105.0.5195.127(正式版本) (64 位) chrome浏览器最新版本,版本 105.0.5195.127(正式版本) (64 位) chrome浏览器最新版本,版本 105.0.5195.127(正式版本) (64 位) chrome...
斑马Zebra105SLPlus是一款高效能的工业级条码打印机,广泛应用于物流、零售、医疗、制造等多个行业。这款打印机以其坚固耐用、高速打印和精准条码质量著称。下面,我们将深入探讨这款打印机的配置和使用方法。 1. *...
标题中的“优越者 USB2.0转RS232串口线 Y105驱动”表明我们正在讨论一种转换器设备,它允许用户通过USB 2.0接口连接到传统的RS232串行端口。这个设备由“优越者”品牌制造,型号为Y105,并且需要特定的驱动程序才能...