`
xly_971223
  • 浏览: 1289351 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

spring中OpenSessionInViewFilter的配置顺序问题

阅读更多
今天程序出现了
引用
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.

实际上这个问题不是第一次出现了 只是一直没有时间来研究它。今天得闲随即打开了OpenSessionInViewFilter这个文件。 首先先看一下我的web.xml配置
<!-- openSessionInView -->
	<filter>
		<filter-name>openSessionInView</filter-name>
		<filter-class>
			org.springframework.orm.hibernate3.support.OpenSessionInViewFilter
		</filter-class>
	</filter>
	<filter-mapping>
		<filter-name>openSessionInView</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>
	
	<!--==================== rewriteFilter ====================-->

	<!--==================== Spring ApplicationContext ====================-->
	<listener>
		<listener-class>
			org.springframework.web.context.ContextLoaderListener
		</listener-class>
	</listener>
	<context-param>
		<param-name>contextConfigLocation</param-name>
		<param-value>
			classpath*:com/redgateonline/showradio/resource/spring/applicationContext*.xml
		</param-value>
	</context-param>

	<!-- ==================== Webwork =================== -->

之前一直怀疑是filter配置的顺序问题 ,有几次修改了配置文件后问题就解决了。
先来看看OpenSessionInViewFilter中的doFilterInternal()方法,这里只给出关键部分,
//从servletContext中取sessionFactory
SessionFactory sessionFactory = lookupSessionFactory(request);
		boolean participate = false;

		if (isSingleSession()) {
			// single session mode
			if (TransactionSynchronizationManager.hasResource(sessionFactory)) {
				// Do not modify the Session: just set the participate flag.
				participate = true;
			}
			else {
				logger.debug("Opening single Hibernate Session in OpenSessionInViewFilter");
				
Session session = getSession(sessionFactory); //通过sessionFactory获取session,这个session被绑定到当前线程中 在整个request期间使用
				TransactionSynchronizationManager.bindResource(sessionFactory, new SessionHolder(session));
			}
		}
		else {
			// deferred close mode
			if (SessionFactoryUtils.isDeferredCloseActive(sessionFactory)) {
				// Do not modify deferred close: just set the participate flag.
				participate = true;
			}
			else {
				SessionFactoryUtils.initDeferredClose(sessionFactory);
			}
		}


看看Session session = getSession(sessionFactory);中的getSession(sessionFactory)是怎么实现的
protected Session getSession(SessionFactory sessionFactory) throws DataAccessResourceFailureException {
		Session session = SessionFactoryUtils.getSession(sessionFactory, true);
		FlushMode flushMode = getFlushMode();
		if (flushMode != null) {
			session.setFlushMode(flushMode);
		}
		return session;
	}

OpenSessionInViewFilter有一个变量flushMode,可通过getter setter为其赋值,而其默认值为FlushMode.NEVER,这儿的NEVER值已经被deprecate了。
原来是这儿在捣鬼,只要写了子类覆盖setFlushMode(FlushMode.auto);就ok了
分享到:
评论
4 楼 xutao5641745 2011-05-31  
byduke 写道
不知道你是故意的还是也没注意,重写完这个方法以后必须重写里面的close方法

protected void closeSession(SessionFactory sessionFactory,Session session){
    session.flush();
    super.closeSession(sessionFactory,session);
}
不然根本不能运行,楼主不厚道啊,这样容易误导人



说的对。。。。
3 楼 Arden 2009-02-23  
试过了,只覆盖setFlushMode(FlushMode.auto)还不行,最好还是重新写一个,把spring的那个的内容copy过来~然后自己设置下flushMode=FlushMode.AUTO
2 楼 davidcen 2008-06-24  

<bean name="openSessionInViewInterceptor"
		class="org.springframework.orm.hibernate3.support.OpenSessionInViewInterceptor">
		<property name="sessionFactory">
			<ref bean="sessionFactory" />
		</property>
		<property name="flushMode" value="1"/>
		<property name="singleSession" value="true" />
	</bean>

just set flushMode value =1
1 楼 byduke 2008-04-03  
不知道你是故意的还是也没注意,重写完这个方法以后必须重写里面的close方法

protected void closeSession(SessionFactory sessionFactory,Session session){
    session.flush();
    super.closeSession(sessionFactory,session);
}
不然根本不能运行,楼主不厚道啊,这样容易误导人

相关推荐

    关于OpenSessionInViewFilter的学习

    OpenSessionInViewFilter是Spring框架中一个非常重要的组件,主要用于解决数据访问层(DAO)与视图层(View)之间的事务管理问题。在Web应用中,由于HTTP请求的无状态性,一次请求通常由多个Servlet过滤器、控制器和...

    OpenSessionInViewFilter

    OpenSessionInViewFilter个人学习总结

    spring框架中常用的配置

    通常情况下,开发者会在`web.xml`中配置此监听器以及应用程序上下文的位置。 - **配置示例**: ```xml &lt;!-- Spring WebApplicationContext 初始化 --&gt; &lt;listener-class&gt;org.springframework.web.context....

    SSH2.0配置日记

    在 Spring 2.5 中,需要在 applicationContext.xml 文件中配置 Bean,以便实现依赖注入。例如,在该文件中可以配置数据源、 Hibernate sessionFactory、事务管理器等。 2. Hibernate 配置 在 Hibernate 中,需要...

    Spring配置总结

    通过在web.xml中配置`OpenSessionInViewFilter`,可以实现持久化层的事务与视图渲染的无缝结合,提高应用性能。 ##### 2. **Struts-config.xml与Spring集成** 当Spring与Struts框架集成时,可以通过`...

    struts2.3+spring3.1.2+hibernate4.1.6 配置说明

    在Spring的配置中,使用了`OpenSessionInViewFilter`来处理数据库会话的生命周期。这个过滤器确保在每次HTTP请求中,都会有一个打开的Hibernate Session,以解决“懒加载”问题。配置中包含了`...

    spring管理struts和hibernate

    - 在`web.xml`中配置`OpenSessionInViewFilter`过滤器,自动管理事务。 #### 三、总结 通过以上步骤,我们不仅可以让Spring有效地管理Struts,实现更灵活的业务逻辑控制,还可以利用Spring的强大功能管理...

    马士兵Spring课堂笔记(超级详细版).pdf

    我们可以通过配置XML文件和注解来实现整合,并使用opensessionInviewfilter来解决会话问题。 Spring JDBC面向接口编程 本节讲解了如何使用Spring JDBC来实现面向接口编程。我们可以通过配置XML文件和注解来实现DAO...

    spring+struts+hibernate的配置文档

    - `contextConfigLocation` 指定了 Spring 配置文件的位置,本例中为 `classpath:applicationContext.xml`,表示 Spring 配置文件位于类路径下的 `applicationContext.xml` 文件中。 - `ContextLoaderListener` ...

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

    解决这个问题的方法有两种:一种是在 web.xml 中使用 Spring 提供的 OpenSessionInViewFilter,另一种是在 application.xml 中配置 OpenSessionInViewFilter。前者通用,后者只能用于 SpringMVC 结构中。 最后,...

    Struts,Spring与hibernate集成

    5. **配置dataSource和SessionFactory**:在Spring配置文件中,你需要配置数据源(dataSource)和SessionFactory,这样可以将Hibernate的配置整合到Spring中,同时可以移除hibernate.cfg.xml文件,让Spring管理...

    Struts+Hibernate+Spring的基本流程

    在Web应用中,为了确保每次请求都能获得新的Session,通常会配置openSessionInViewFilter,保证数据操作的正确性。 整合SSH的步骤如下: 1. 引入SSH相关的jar包,确保版本兼容。Struts和Hibernate的jar包可以从IDE...

    Spring面试题大全

    3. 在使用中如果遇到OpenSessionInView的问题,可以添加OpenSessionInViewFilter或OpenSessionInViewInterceptor。 五、Spring的事务管理 Spring框架提供了事务管理机制,提供了几个关于事务处理的类: 1. ...

    spring2.5学习PPT 传智博客

    - 利用CharacterEncodingFilter和OpenSessionInViewFilter解决编码问题。 通过以上内容的学习,开发者可以深入理解Spring 2.5的核心概念,掌握其在实际开发中的应用,从而提高工作效率和代码质量。

    SSH详细配置文件(自己个人经验)

    - **添加Hibernate**:选择Hibernate3.3及其所有Spring库,将Hibernate整合到Spring中,通过Spring配置文件管理。 - **解决Jar包冲突**:删除自动导入的可能冲突的库,手动替换为EShopping示例中的Jar包,确保版本...

    struts_hibernate_spring集成

    在Struts配置文件中,为了与Spring集成,需将默认的Action映射类型更改为Spring提供的`DelegatingActionProxy`,这样可以让Spring负责Action的实例化和控制流的管理。 此外,Action Bean的定义需要在Spring的配置...

    spring面试题大全

    面试中,Spring的相关问题经常出现,下面将详细解答这些常见面试题。 首先,Spring的优点包括: 1. 分层架构:Spring允许开发者选择需要的模块,避免了不必要的复杂性。 2. POJO(Plain Old Java Object)编程:它...

    Struts+hibernate+Spring的整合

    10. **延迟加载问题**:为了处理Hibernate的延迟加载问题,可以使用Spring的`OpenSessionInViewFilter`。这个过滤器确保在一次HTTP请求的整个生命周期内,Hibernate的Session保持打开状态,允许延迟加载在请求结束时...

    spring面试题大全.doc

    - **配置 DataSource 和 SessionFactory**:在 Spring 配置文件中定义数据源和 Hibernate 的 SessionFactory,设置相应的参数。 - **DAO 层集成**:DAO 类继承自 HibernateDaoSupport,并实现具体业务接口,通过 ...

    Struts+Hibernate+Spring的整合方法

    2. **配置dataSource和SessionFactory**:在Spring的配置文件中,你需要配置数据源(dataSource)和SessionFactory,这样可以将Hibernate的配置集成到Spring中,通常可以移除单独的hibernate.cfg.xml文件。...

Global site tag (gtag.js) - Google Analytics