`

解决hibernate 设置为lazy=“true”的集合,通过struts1 访问的时候报session已经关闭的问题

    博客分类:
  • J2EE
阅读更多

在使用struts1 + hibernate(Struts2没有这问题)过程中,经常要访问lazy="true"的集合类型属性,可是这时候报session已经关闭的现象。

要解决这个问题我们要分析OpenSessionInViewFilter这个类。 OpenSessionInViewFilter是按照WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE这个key去获取spring配置信息的! 所以,我们在使用过程中配置OpenSessionInViewFilter就不起作用。

解决方法: 修改ContextLoaderPlugIn代码,在getServletContext().setAttribute(attrName, wac);这个地方加上一行代码:  getServletContext().setAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE, wac);  
 或者

修改OpenSessionInViewFilter,让它按照attrName去取得spring配置。 

我们按照第一种方法来配置

1.重写struts的插件继承自spring的ContextLoaderPlugIn 的类。

package com.test.plugIn;
import org.springframework.beans.BeansException;
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.support.WebApplicationContextUtils;
import org.springframework.web.struts.ContextLoaderPlugIn;


public class MyContextLoaderPlugIn extends ContextLoaderPlugIn {
	protected WebApplicationContext initWebApplicationContext()
			throws BeansException, IllegalStateException {
		WebApplicationContext parent = WebApplicationContextUtils
				.getWebApplicationContext(getServletContext());

		WebApplicationContext wac = createWebApplicationContext(parent);

		String attrName = getServletContextAttributeName();
		getServletContext().setAttribute(attrName, wac);
		getServletContext().setAttribute(
				WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE,
				wac); 
		return wac;
	}

}

 2.配置web.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	version="2.5"
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee   http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">

	<filter>
		<filter-name>Set Character Encoding</filter-name>
		<filter-class>
			com.navinfo.telematics.roadmap.web.filter.SetCharacterEncodingFilter</filter-class>
		<init-param>
			<param-name>encoding</param-name>
			<param-value>UTF-8</param-value>
		</init-param>
	</filter>
	<filter>
    <filter-name>hibernateFilter</filter-name>
        <filter-class>
           org.springframework.orm.hibernate3.support.OpenSessionInViewFilter
         </filter-class>
    </filter>
	<filter-mapping>
	   <filter-name>hibernateFilter</filter-name>
	    <url-pattern>*.do</url-pattern>
	</filter-mapping>
	<filter-mapping>
		<filter-name>Set Character Encoding</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>
	<servlet>
		<servlet-name>action</servlet-name>
		<servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
		<init-param>
			<param-name>config</param-name>
			<param-value>/WEB-INF/struts-config.xml</param-value>
		</init-param>
		<init-param>
			<param-name>debug</param-name>
			<param-value>3</param-value>
		</init-param>
		<init-param>
			<param-name>detail</param-name>
			<param-value>3</param-value>
		</init-param>
		<load-on-startup>0</load-on-startup>
	</servlet>
	<servlet-mapping>
		<servlet-name>action</servlet-name>
		<url-pattern>*.do</url-pattern>
	</servlet-mapping>

	<welcome-file-list>
		<welcome-file>index.jsp</welcome-file>
	</welcome-file-list>
</web-app>

 3.更改struts-config.xml 

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.3//EN" "http://struts.apache.org/dtds/struts-config_1_3.dtd">

<struts-config>
	<form-beans>
	........	
	</form-beans>
	<global-exceptions />
	<global-forwards />
	<action-mappings>
  	.......
	</action-mappings>
	<message-resources parameter="i18n.ApplicationResources" />
	<plug-in
		className="com.test.plugIn.MyContextLoaderPlugIn">
		<set-property property="contextConfigLocation"
			value="/WEB-INF/classes/spring/applicationContext.xml" />
	</plug-in>
</struts-config>

  

分享到:
评论

相关推荐

    hibernate的延迟检索在轻量级J2EE框架中的应用

    在Hibernate中,可以通过在实体的映射配置文件中设置`lazy="true"`来启用实体对象的延迟加载。 例如,对于一个User实体: ```xml &lt;hibernate-mapping&gt; &lt;class name=...

    Hibernate延迟加载介绍.doc

    在Hibernate中,实体对象的延迟加载可以通过在映射文件中设置`lazy="true"`来启用。例如,对于名为`com.neusoft.entity.User`的实体类,映射配置如下: ```xml &lt;Hibernate-mapping&gt; &lt;class name=...

    过滤器对于session周期的控制

    这有助于避免因Session关闭而导致的异常。但是,如果设置为`false`,则每次执行数据库操作时都会创建一个新的Session,这可能导致性能问题以及难以管理的Session生命周期。 #### 总结 综上所述,`...

    struts2+HIbernate 多对一关系 及部分删除

    这可以通过在数据库中添加一个“isDeleted”字段来实现,当该字段被设置为true时,表示该记录已被删除。在Hibernate中,我们可以使用`@SQLDelete`和`@Where`注解来实现这个功能。 ```java // 在学生实体类中添加...

    Struts+Spring+Hibernate快速入门

    ### Struts+Spring+Hibernate快速入门 #### 一、引言 在当今的企业级Web应用程序开发中,Struts、Spring 和 Hibernate 这三大框架被广泛应用于构建高效、可维护的应用程序。本文旨在介绍如何利用这三种技术搭建一个...

    hibernate面试题2

    2. **查看Hibernate生成的SQL**:在`applicationConfig.xml`中设置`hibernate.show_sql`为`true`,即可在控制台查看执行的SQL。但要注意,这可能会影响性能优化。 3. **Hibernate缓存策略**: - **只读(Read-only...

    Hibernate一对多关系的处理.doc

    在本文中,我们将深入探讨Hibernate框架中的一对多关系处理,这是对象关系映射(ORM)的一个关键概念。Hibernate作为Java领域内的一个流行ORM工具,它允许开发者将数据库操作转化为对象模型的操作,简化了数据库应用...

    优化Hibernate性能的几点建议

    通过将`hibernate.show_sql`属性设置为`true`,可以查看Hibernate执行的所有SQL语句,这对于调试和性能调优非常有帮助。不过需要注意的是,在生产环境中应谨慎使用此选项,以免影响性能。 #### 十、综合优化技术栈 ...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part2

     16.3.2 延迟检索(lazy属性为默认值“true”)  16.3.3 增强延迟检索(lazy属性为“extra”)  16.3.4 批量延迟检索和批量立即检索(使用batch-size属性)  16.3.5 用带子查询的select语句整批量初始化orders...

    如何实现webwork+spring+hibernate框架结合

    WebWork+Spring+Hibernate是早期比较流行的一种技术组合,它们各自解决的问题域不同,但结合起来可以形成一个强大的企业级开发框架。接下来我们将详细介绍如何实现这三种框架的结合。 #### 第一步:构建Java Web ...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part1.rar

     16.3.2 延迟检索(lazy属性为默认值“true”)  16.3.3 增强延迟检索(lazy属性为“extra”)  16.3.4 批量延迟检索和批量立即检索(使用batch-size属性)  16.3.5 用带子查询的select语句整批量初始化orders...

    Spring_Structs_Hibernate

    可以通过设置`lazy="true"`来实现延迟加载。 - 集合(Collection):同样地,集合也可以设置为延迟加载。 - **Hibernate 3 属性的延迟加载:** 当Hibernate查询数据时,并不会立即将数据加载到内存中,而是等到...

    Hibernate数据关联实现〖1VS1〗_

    在给定的文件"28-Hibernate数据关联实现〖1VS1〗_Struts + DAO + Hibernate(2)"中,可能包含了一个完整的示例,涵盖了使用Struts、DAO模式和Hibernate实现1对1关联的代码。这个例子可能展示了如何在Action类中处理...

    遇到的问题1

    2. **Hibernate的session问题**: "no session or session was closed"提示可能是因为在Hibernate配置文件中,外键的lazy属性设置为"true"。若需要立即加载关联对象,应将其改为"false"。 3. **Struts的checkbox使用...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part4

     16.3.2 延迟检索(lazy属性为默认值“true”)  16.3.3 增强延迟检索(lazy属性为“extra”)  16.3.4 批量延迟检索和批量立即检索(使用batch-size属性)  16.3.5 用带子查询的select语句整批量初始化orders...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part3

     16.3.2 延迟检索(lazy属性为默认值“true”)  16.3.3 增强延迟检索(lazy属性为“extra”)  16.3.4 批量延迟检索和批量立即检索(使用batch-size属性)  16.3.5 用带子查询的select语句整批量初始化orders...

    ssh(structs,spring,hibernate)框架中的上传下载

     以上是Spring+Hibernate将文件二进制数据持久化到数据库的解决方案,而Struts通过将表单中file类型的组件映射为ActionForm中类型为org.apache.struts.upload. FormFile的属性来获取表单提交的文件数据。  工程...

    SSH框架面试题

    - **实体对象**: 可以通过设置`lazy="true"`属性来实现对实体对象的延迟加载。 - **集合(Collection)**: 类似实体对象,集合也可以通过`lazy="true"`属性来实现延迟加载。 **2.3 Hibernate 3的延迟加载功能** 在...

    ssh事务配置.txt

    它结合了MVC(Model-View-Controller)设计模式的优势,提供了灵活的数据访问层(Hibernate)、业务逻辑处理(Spring)以及表现层(Struts)的支持。 在本文档中,我们将详细介绍如何在SSH框架中进行事务管理配置,...

    OA项目SSH整合框架

    1,对于集合属性,默认是lazy="true"的,在第一次使用时才加载。 2,但在加载时,如果Session已经关掉了就会抛LazyInitializationException异常 二,集成 Spring 与 Struts2.1.8.1 1,在web.xml配置监听器...

Global site tag (gtag.js) - Google Analytics