`
阅读更多

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 

分享到:
| 104
评论

相关推荐

    kcu105-schematic-xtp392.zip

    《Xilinx KCU105开发板及其设计资源详解》 Xilinx的KCU105开发板是一款基于高性能FPGA——KU040芯片的综合开发平台,深受硬件开发者和系统工程师的喜爱。该开发板提供了丰富的接口和功能,为用户在设计、验证和实现...

    CP105维修工具

    CP105维修工具是针对CP 105B设备的专业设定和维修程序,它为工厂技术人员提供了便利的诊断和修复功能。CP105B是一款广泛应用的工业级设备,可能涉及自动化、数据通信或其他复杂系统集成。在这个压缩包文件中,包含的...

    STM8S105K4单片机最小系统开发板PDF原理图+库软件例程+STM8中文手册及文档资料合集.zip

    STM8S105K4单片机最小系统开发板PDF原理图+库软件例程+STM8中文手册及相关文档资料合集: IAR105例程 STM8A%3a汽车电子MCU方案.pdf STM8S105K4T6原理图.pdf STM8S105K4库例程 STM8S105xxx中文数据手册.pdf STM8S_...

    FC105的使用_fc105_FC105下载_FC105的使用_

    FC105是一款在工业自动化领域中广泛应用的功能模块,主要用于处理模拟量输入信号,如1~5V或4~20mA的标准电信号。这些信号通常来自传感器或变送器,用于表示连续的过程变量,如温度、压力、液位等。在本文中,我们将...

    博越实体电子STM8S105C6开发板光盘资料_配套源码.rar_STM8S库函数版本_stm8s105 博越_博越STM8开发

    这个压缩包包含的资料对于STM8S系列的开发至关重要,特别是对STM8S105这款微控制器的初学者和专业开发者来说,提供了宝贵的编程和调试资源。 STM8S库函数版本是STMicroelectronics(意法半导体)为STM8系列微控制器...

    基于STM8S105单片机 USART串口通信实验例程软件源码.rar

    STM8S105是一款由STMicroelectronics生产的8位微控制器,属于STM8系列。它在许多嵌入式系统设计中被广泛应用,特别是在需要高效能和低功耗的场合。这个压缩包包含的是一个关于STM8S105单片机的USART(通用同步/异步...

    基于STM8S105单片机 动态数码管显示实验例程软件源码.rar

    STM8S105是一款由STMicroelectronics推出的8位微控制器,属于STM8系列,具有高性能、低功耗的特点。这个实验例程主要是利用STM8S105单片机进行动态数码管显示,这对于理解和掌握微控制器在硬件驱动和数字显示方面的...

    stm8s105 数据手册

    STM8S105系列单片机是一款基于STM8内核的8位微控制器,广泛应用于各种嵌入式系统和智能设备中。该系列产品的特点包括支持高达32K字节的Flash程序存储器,以及最多1K字节的EEPROM数据存储器,具有较好的数据保持能力...

    STM32F105的CAN和UART例程

    STM32F105是意法半导体(STMicroelectronics)推出的一款基于ARM Cortex-M3内核的微控制器,广泛应用于工业控制、汽车电子、物联网设备等领域。在本例程中,重点涉及了两个主要的通信接口:CAN(Controller Area ...

    安桥 MD-105X说明书

    《安桥 MD-105X迷你光碟录音机使用指南》 一、产品概览与特点 安桥MD-105X是一款先进的迷你光碟(MiniDisc)录音机,具备多项专业功能,旨在为用户提供高质量的音频录制与播放体验。在购买此设备后,用户应仔细阅读...

    KCU105原理图.pdf

    KCU105原理图文件涉及Xilinx公司生产的Kintex UltraScale系列FPGA开发平台——KCU105,它是一个评估平台,用于Kintex UltraScale KCU040系列FPGA的开发。原理图是电子工程中极其重要的文档,它详细描述了硬件电路的...

    CCNA Routing and Switching Practice Tests: Exam 100-105, 200-105,200-125

    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 ...

    S7-1500PLC工艺对象 105报文安装S7-1500PLC工艺对象 105报文安装S7-1500PLC工艺对象 105报文

    S7-1500PLC工艺对象 105报文安装S7-1500PLC工艺对象 105报文安装S7-1500PLC工艺对象 105报文安装S7-1500PLC工艺对象 105报文安装S7-1500PLC工艺对象 105报文安装 HSP硬件目录支持包

    libaio-0.3.105-i386.rpm

    标题中的"libaio-0.3.105-i386.rpm"是一个Linux操作系统下的软件包,属于libaio库的一个版本,用于提供异步I/O支持。libaio,全称Library for Asynchronous Input/Output,是Linux内核提供的一种用户空间直接与硬件...

    libaio-0.3.105

    《Linux系统中libaio-0.3.105的安装与应用》 在Linux操作系统中,libaio(Linux Asynchronous I/O)库扮演着至关重要的角色,它为应用程序提供了一种异步I/O操作的方式,允许程序在等待I/O操作完成时继续执行其他...

    维宏NK105G2厂商手册-R6.rar

    《维宏NK105G2厂商手册-R6》是一份详细阐述维宏公司NK105G2控制器技术规格、功能特性和操作指南的重要参考资料。这份手册主要针对使用该控制器的用户,包括制造商、工程师和技术人员,为他们提供全面的技术支持和...

    星宸科技SSW105 IOT WIFI芯片规格书.pdf

    SSW105是星宸科技(SigmaStar)推出的一款专为物联网(IoT)设计的高性能Wi-Fi芯片,其特点在于低功耗和高效能。这款芯片在DTM3模式下,待机电流仅为150uA,这一指标在行业中处于领先地位,与TI、MTK和Cypress等知名...

    斑马[ZERBRA]105SL中文字体写入打印机

    斑马(Zebra)105SL系列打印机是一款广泛应用于工业级条形码和标签打印的设备,因其坚固耐用和高效性能而备受青睐。然而,在初次使用时,有些用户可能会遇到一个问题:打印机默认可能不支持中文字符打印,这给需要中文...

    google chrome浏览器最新版本,版本 105.0.5195.127(正式版本) (64 位)

    chrome浏览器最新版本,版本 105.0.5195.127(正式版本) (64 位) chrome浏览器最新版本,版本 105.0.5195.127(正式版本) (64 位) chrome浏览器最新版本,版本 105.0.5195.127(正式版本) (64 位) chrome...

    斑马Zebra105SLPlus条码打印机中文说明书设置手册大全

    斑马Zebra105SLPlus是一款高效能的工业级条码打印机,广泛应用于物流、零售、医疗、制造等多个行业。这款打印机以其坚固耐用、高速打印和精准条码质量著称。下面,我们将深入探讨这款打印机的配置和使用方法。 1. *...

Global site tag (gtag.js) - Google Analytics