`

Spring+Hibernate+Struts之懒加载问题的解决 (转)

    博客分类:
  • java
 
阅读更多

转自:http://blog.csdn.net/aspdao/article/details/5472955

步骤1:将所有的*.hbm.xml文件中的lazy="false"改成lazy="true"

步骤2:替换MyEclipse自动添加的jar包cglib-2.1.3.jar为cglib-2.2_beta1.jar,否则会出现如下异常

 

java.lang.NullPointerException org.hibernate.tuple.AbstractEntityTuplizer.createProxy(AbstractEntityTuplizer.java:372)

...

 

 

步骤3:在项目的web.xml中添加(注意这个Filter要在struts的Filter的前面)

[xhtml] view plain copy
  1. < listener >   
  2.     < listener-class >   
  3.         org.springframework.web.context.ContextLoaderListener  
  4.     </ listener-class >   
  5. </ listener >   
  6. < context-param >   
  7.     < param-name > contextConfigLocation </ param-name >   
  8.     < param-value > /WEB-INF/applicationContext.xml </ param-value >   
  9. </ context-param >    
  10. lt;filter>   
  11.     < filter-name > hibernateFilter </ filter-name >   
  12.     < filter-class >   
  13.         org.springframework.orm.hibernate3.support.OpenSessionInViewFilter  
  14.     </ filter-class >   
  15. <!--     < init-param >   
  16.         < param-name > singleSession </ param-name >   
  17.         < param-value > true </ param-value >   
  18.     </ init-param >  -- >   
  19. </ filter >   
  20. < filter-mapping >   
  21.     < filter-name > hibernateFilter </ filter-name >   
  22.     < url-pattern > /* </ url-pattern >   
  23. </ filter-mapping >   
 

 

步骤4:将struts配置文件中的一段去掉(之前没有发现这里,导致配置完成后一部分懒加载还是抛异常)

javax.servlet.ServletException:

org.hibernate.LazyInitializationException:

could not initialize proxy - the owning Session was closed

 

 

[xhtml] view plain copy
  1. <!--   
  2.     < plug-in   
  3.         className = "org.springframework.web.struts.ContextLoaderPlugIn" >   
  4.         < set-property   property = "contextConfigLocation"   
  5.             value = "/WEB-INF/applicationContext.xml"   />   
  6.     </ plug-in >   
  7.  -->   
 

 

 

至此,所有的页面访问全部都正常了,sql语句由原来的上百条减少到几条,(仅仅是那些必须的sql语句了),响应时间也由原来的几秒十几秒减少到 了1秒以内,多数为0.5秒,有的减少到0.1秒以内。可见效果有多么明显!!但是现在所有的查询操作没问题了,但是update和save还是不行,还 是哪里的配置不对,抛出的异常为:

javax.servlet.ServletException: org.springframework.dao.InvalidDataAccessApiUsageException:

Write operations are not allowed in read-only mode (FlushMode.NEVER/MANUAL):

Turn your Session into FlushMode.COMMIT/AUTO or remove 'readOnly' marker from transaction definition.

 

 

 

 

 

这个异常产生的主要原因是DAO采用了Spring容器的事务管理策略,如果操作方法的名称和事务策略中指定的被管理的名称不能够匹配 上,spring 就会采取默认的事务管理策略(PROPAGATION_REQUIRED,read only).如果是插入和修改操作,就不被允许的,所以包这个异常

 

解决的办法是利用Spring的AOP,过滤那些update、delete、save、create等非只读操作,并将其设置正确的事务管理策略,而不是默认的设置。

 

在Spring配置文件applicationContext.xml中加入下面代码:

 

[xhtml] view plain copy
  1. < bean   id = "transactionManager"   class = "org.springframework.orm.hibernate3.HibernateTransactionManager" >     
  2.   < property   name = "sessionFactory" >     
  3.       < ref   bean = "sessionFactory" />     
  4.   </ property >     
  5. </ bean >     
  6. <!-- 配置事务通知 -->     
  7. < tx:advice   id = "txAdvice"   transaction-manager = "transactionManager" >     
  8.   < tx:attributes >     
  9.     < tx:method   name = "save*"   propagation = "REQUIRED"   read-only = "false" />   
  10.     < tx:method   name = "create*"   propagation = "REQUIRED"   read-only = "false" />   
  11.     < tx:method   name = "delete"   propagation = "REQUIRED"   read-only = "false" />     
  12.     < tx:method   name = "find*"   propagation = "REQUIRED"   read-only = "true" />   
  13.     < tx:method   name = "list*"   propagation = "REQUIRED"   read-only = "true" />   
  14.     < tx:method   name = "get*"   propagation = "REQUIRED"   read-only = "true" />     
  15.     < tx:method   name = "*"   read-only = "true" />     
  16.   </ tx:attributes >     
  17. </ tx:advice >     
  18. <!--添加事务-->        
  19. < aop:config >     
  20.   <!--切入点-->     
  21.   < aop:pointcut   id = "txPointCut"   expression = "execution(* cn.gov.ggj.service.impl.*.*(..))" />     
  22.   <!--通知器-->     
  23.   < aop:advisor   advice-ref = "txAdvice"   pointcut-ref = "txPointCut" />     
  24. </ aop:config >     
 

 

Eclipse不能识别<tx:advice/>标签

在开发Spring的过程中,有时会出现Eclipse不能识别<tx:advice/>标签。

提示出现以下错误:

The prefix "tx" for element "tx:advice" is not bound

 

原因是<beans>中要加入“xmlns:aop”的命名申明,并在“xsi:schemaLocation”中指定aop配置的schema的地址


配置文件如下:

 

[xhtml] view plain copy
  1. <? xml   version = "1.0"   encoding = "UTF-8" ?>   
  2. < beans   xmlns = "http://www.springframework.org/schema/beans"   
  3.      xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"   
  4.      xmlns:aop = "http://www.springframework.org/schema/aop"   
  5.      xmlns:tx = "http://www.springframework.org/schema/tx"   
  6.      xsi:schemaLocation ="  
  7.      http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd  
  8.      http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd  
  9.      http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd">   
 

 

至此不会再报错了,下面解释一下aop中的设置

 

Spring使用 <tx:advice>和 <aop:config> 用来配置事务,具体如何配置你可以参考Spring文档。

我解释一下(* cn.gov.ggj.service.impl.*.*(..))中几个通配符的含义:

第一个 * —— 通配 任意返回值类型
第二个 * —— 通配 包cn.gov.ggj.service.impl下的任意class
第三个 * —— 通配 包cn.gov.ggj.service.impl下的任意class的任意方法
第四个 .. —— 通配 方法可以有0个或多个参数

综上:包cn.gov.ggj.service.impl下的任意class的具有任意返回值类型、任意数目参数和任意名称的方法

 

 


之所以用一个Filter来解决Hibernate懒加载的问题,见下面文章的解释:

 

 

Hibernate的强大之处之一是懒加载功能,可以有效的降低数据库访问次数和内存使用量。但用的不好就会出现org.hibernate.LazyInitializationException。

这个异常出现的原因很简单,主要时在加载懒数据时Session已经关闭造成的,如下图:

 

那么OK,我们来考虑怎么解决吧。

我们只要在渲染JSP之前不要关闭Session,而在JSP渲染之后再关闭就OK啊。我们知道,在JSP/Servlet中,可以配置过滤器来实现这种功能。

 

分享到:
评论

相关推荐

    Struts2+Spring+hibernate中对action的单元测试环境搭建[总结].pdf

    搭建 Struts2+Spring+Hibernate 框架中的 Action 单元测试环境需要解决三个主要问题:如何测试 Action?如何解决 JPA 中的 Lazy 机制?如何做用户 Session 管理?通过使用 StrutsSpringTestCase 和 junit4.jar,可以...

    ssh框架整合详细步骤(spring+struts2+hibernate)

    ### SSH框架整合详细步骤(spring+struts2+hibernate) #### 一、整合概述 在现代Web应用开发中,SSH(Struts2、Spring、Hibernate)框架因其各自独特的功能和优势,常被组合使用以构建高效、稳定且易于维护的系统...

    spring+hibernate+struts2整合

    本项目主要涉及的是Spring、Hibernate和Struts2这三个主流的Java开发框架的整合。它们分别负责不同的职责:Spring作为全能型容器,管理对象和依赖注入;Hibernate是持久层框架,负责数据库操作;而Struts2则是一个...

    java web 实战宝典_JSP+Servlet+Struts_2+Hibernate+Spring+Ajax

    根据标题、描述和部分内容,知识点覆盖范围主要集中在Java Web开发领域,并且包括了JSP、Servlet、Ajax以及SSH框架(Struts 2、Spring、Hibernate)的技术整合和实战案例分析。 JSP(Java Server Pages)是一种动态...

    Struts+Spring+Hibernate框架概述

    Struts、Spring 和 Hibernate 是Java开发中非常著名的三个开源框架,它们组合在一起通常被称为SSH框架。这个框架集合为开发者提供了一种高效、可扩展且结构化的解决方案,用于构建企业级的Web应用程序。下面将详细...

    spring3+hibernate3+struts2实现简易后台菜单控制

    标题 "spring3+hibernate3+struts2实现简易后台菜单控制" 涉及的是一个基于Java Web的经典技术栈构建的后台管理系统。这个系统利用Spring 3作为整体框架,提供依赖注入和AOP(面向切面编程)功能;Hibernate 3作为...

    Ajax(DWR) + Spring + Hibernate + Struts整合登陆注册

    Ajax、Spring、Hibernate和Struts是Java Web开发中的四大核心技术,它们各司其职,共同构建了一个高效、灵活且功能强大的后端架构。这个小例子将这四个框架整合在一起,用于实现一个登录注册系统,提供了从客户端到...

    Struts2+Spring+Hibernate+Ehcache+AJAX+JQuery+Oracle 框架集成用户登录注册Demo工程

    2.Action里通过struts2-spring-plugin.jar插件自动根据名字注入。 3.Ajax无刷新异步调用Struts2,返回Json数据,以用户注册为例。 4.在服务端分页查询功能,优点:实时性:跳页才查询。数据量小:只加载当前页的记录...

    Struts+Spring+Hibernate+Ajax的Demo

    Struts、Spring、Hibernate和Ajax是Java Web开发中的四大核心技术,它们共同构建了一个高效、灵活的Web应用程序架构。在这个"Struts+Spring+Hibernate+Ajax的Demo"中,开发者使用了这些技术来创建一个功能丰富的示例...

    spring+struts+hibernate框架

    "Spring+Struts+Hibernate"(SSH)框架是Java Web开发中的经典组合,被誉为"三剑客"。这个框架集合提供了全面的企业级应用解决方案,帮助开发者构建高效、可扩展且易于维护的Web应用程序。 Spring框架是核心,它...

    struts+spring+hibernate整合

    Struts、Spring和Hibernate是Java Web开发中的三大主流框架,它们分别负责表现层、业务层和服务层的管理。Struts提供了MVC模式的实现,Spring则是一个全面的轻量级应用框架,包括依赖注入(DI)、面向切面编程(AOP...

    struts+spring+hibernate集成说明(英文原版)

    Hibernate支持懒加载、缓存策略、事务管理和复杂的查询,极大地提高了开发效率和代码的可读性。 **Struts+Spring+Hibernate集成**: 集成这三个框架,可以实现高效的MVC架构。Spring作为整个应用的中心,管理Struts...

    struts2.1+spring2.5+hibernate3.3整合之第一步(spring2.5+hibernate3.3)

    Struts2.1、Spring2.5和Hibernate3.3是经典的Java企业级开发框架组合,它们各自在应用程序的不同层面提供了强大的支持。本篇将详细阐述这三个组件的整合过程,以及各自的核心特性。 首先,Struts2是一个基于MVC设计...

    Spring2.5.3+Hibernate3.2+Struts2.0.11整合.

    在IT领域,尤其是在Java Web开发中,Spring、Hibernate和Struts是三个非常重要的框架,它们分别负责不同层面的管理:Spring作为一个全面的轻量级框架,涵盖了依赖注入、AOP(面向切面编程)、MVC(模型-视图-控制器...

    struts2+spring+hibernate的例子

    Struts2、Spring和Hibernate是Java Web开发中的三大框架,它们的组合被称为SSH(Struts2,Spring,Hibernate)。这个例子提供了一个完整的SSH整合应用,适用于初学者了解和学习这三大框架如何协同工作。 首先,...

    用户注册和登录是每个系统的必须存在的一部分,基于Dwr+Struts2+Spring+Hibernate写了一个用户登录注册系统

    用户注册和登录是每个系统的必须存在的一部分,基于Dwr+Struts2+Spring+Hibernate写了一个用户登录注册系统。  其中用Dwr去进行用户注册的用户是否存在的验证。  全部业务控制交由Spring去进行处理。事务处理也...

    struts+spring+hibernate(三大框架),外加ajax

    Struts、Spring和Hibernate是Java开发中非常著名的三大框架,它们各自解决了一部分软件开发中的问题,而将它们集成在一起可以构建出强大的企业级应用。这个压缩包文件提供了一个使用这三个框架加上Ajax技术的详细...

    解决struts2.1.6+spring+hibernate 中文乱码

    ### 解决Struts2.1.6 + Spring + Hibernate 中文乱码问题 在Web开发过程中,特别是使用Java EE框架时,字符编码问题一直是开发者关注的重点之一。对于使用Struts2.1.6、Spring以及Hibernate这三个框架组合的项目而...

    Struts+Spring+Hibernate练习(完整源码)

    Hibernate支持懒加载和级联操作,提高了数据操作的效率和灵活性。 在Struts、Spring和Hibernate整合的项目中,通常会使用Spring的ApplicationContext来管理Struts的Action和Hibernate的SessionFactory。Spring的...

Global site tag (gtag.js) - Google Analytics