`
kjkhi
  • 浏览: 181711 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

OpenSessionInViewFilter更新问题

阅读更多
在项目中配置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在getSession的时候,会把获取回来的session的flushMode 设为FlushMode.NEVER。然后把该sessionFactory绑定到TransactionSynchronizationManager,使request的整个过程都使用同一个session。
FlushMode.NEVER模式不具备写操作,可以把session配置为FlushMode.AUTO,如在web.xml中配置:
<filter>
  	<filter-name>OpenSessionInView</filter-name>
  	<filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>
  		<init-param>
          	<param-name>flushMode</param-name>
          	<param-value>AUTO</param-value>
      	</init-param>
  </filter>


其次,会遇到的另外一个问题是页面更新操作,因为这个流程是:首先查询取得数据库中的记录,修改客户端改变的属性,更新这个实体类。这是通过以上配置OpenSessionInViewFilter,在session更新实体类之前,session已经存在一个实体类,与客户端传过来的需要修改的实体类会发生冲突,以致更新失败。这个可以通过配置singleSession=false解决。也可以通过重写OpenSessionInViewFilter类的getSession及closeSession方法实现,如:
public class MyOpenSessionInViewFilter extends OpenSessionInViewFilter{

	@Override
	protected void closeSession(Session session, SessionFactory sessionFactory) {
		session.flush();
		session.getTransaction().commit();
		super.closeSession(session, sessionFactory);
	}

	@Override
	protected Session getSession(SessionFactory sessionFactory)
			throws DataAccessResourceFailureException {
		Session session = SessionFactoryUtils.getSession(sessionFactory, true);
		session.beginTransaction();
		FlushMode flushMode = getFlushMode();
		if (flushMode != null) {
			this.setFlushMode(FlushMode.AUTO);
		}
		return session;
	}

}
0
0
分享到:
评论
3 楼 onlyOneToOne 2013-06-17  
如果你在项目中配置了OpenSessionInViewFilter,但是没有配置事务,它会认为你访问的方法默认的事务边界为read-only。所以建议配置事务后使用。不要刻意去修改OpenSessionInViewFilter的flushMode!
2 楼 sswh 2011-06-28  
另外,设置singleSession=false的含义是 延迟Session的关闭到Filter结束的时候。
singleSession=false并不决定使用同一个Session还是多个Session。
这个还是要由Spring事务传播行为来决定。
而使用多个Session反而更容易出现update失败的情况。
1 楼 sswh 2011-06-28  
第1个问题:
在写操作的时候尽量使用事务(比如,Spring事务在打开时会更改FlushMode)。
OpenSessionInView的FlushMode设置为Never是有道理的,
这对于列表或者查询请求,会去掉hibernate进行脏检查的时间,可以提升效率。

第2个问题:
可以用merge方法,就不会出现update失败的情况了。
但通常update执行之前,如果不做复杂查询的话,一般update也很少会出错的。

另外,按你更改的代码,问题更多:
1、底层数据库连接时间延长了(扩展到了Filter的范围),而正常使用OpenSessionInView的话,是在打开事务的时候才获取底层数据库连接的。
2、没法处理回滚的情况。
3、对于查询类请求,效率降低。(FlushMode.AUTO)

相关推荐

    OpenSessionInViewFilter

    OpenSessionInViewFilter个人学习总结

    关于OpenSessionInViewFilter的学习

    NULL 博文链接:https://yanzhenwei.iteye.com/blog/1701164

    Sping 事务管理.doc

    OpenSessionInViewFilter解决Web应用程序的问题

    SSH项目整合示例【OpenSessionInView】所用到的jar包

    SSH项目整合示例【OpenSessionInView】所用到的jar包 包含Struts + Hibernate + Spring所有jar及其依赖的jar

    jar包(struts2.0.8+spring2.0+hibernate3.2)

    struts2.0.8+spring2.0+hibernate3.2 jar包

    spring_demo:Spring MVC示范项目

    在更新或删除数据时,必须调用getHibernateTemplate().flush(); 且在web.xml中添加 &lt;filter&gt;openSessionInViewFilter &lt;filter&gt;org.springframework.orm.hibernate4.support.OpenSessionInViewFilter &lt;param&gt;...

    spring_note.rar_inversion_spring concept

    课程内容 面向接口(抽象)编程的概念与好处 IOC/DI的概念与好处 inversion of control dependency injection AOP的概念与好处 ...opensessionInviewfilter(记住,解决什么问题,怎么解决) Spring JDBC

    S2SH集成 案例

    该案例实现了一个简单的登录功能,但里面将S2SH集成的所有配置信息都添加进去了。 如,OpenSessionInViewFilter、声明式事务、三层等等

    Mac Mysql数据库中文乱码问题解决

    当我们用框架进行数据库的存储操作时,经常会遇到中文乱码的问题。 如:在使用Java中得SSH框架时,我们需要在web.xml文件中配置编码的filter,具体代码是: &lt;span xss=removed&gt;&lt;!-- 表单处理乱码,必须在...

    struts+spring+hibernate整合

    Spring4.0、Struts2.3.15、Hibernate4.2.4、jQuery1.9.1涉及到了诸多开发时的细节:ModelDriven、Preparable 拦截器、编写自定义的类型转换器、Struts2 处理 Ajax、OpenSessionInViewFilter、迫切左外连接、Spring ...

    OA项目SSH整合框架

    3,在web.xml中配置 spring 的 OpenSessionInView 过滤器(解决抛LazyInitializationException的问题) 1,配置 &lt;!-- 配置 spring 的 OpenSessionInView 过滤器 --&gt; &lt;filter-name&gt;OpenSessionInView ...

    SPRING API 2.0.CHM

    OpenSessionInViewFilter OpenSessionInViewInterceptor OpenSessionInViewInterceptor OptimisticLockingFailureException OptionsTag OptionTag OptionWriter OracleLobHandler OracleLobHandler....

Global site tag (gtag.js) - Google Analytics