-
- 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.
-
at org.springframework.orm.hibernate3.HibernateTemplate.checkWriteOperationAllowed(HibernateTemplate.java:1186)
-
at org.springframework.orm.hibernate3.HibernateTemplate$12.doInHibernate(HibernateTemplate.java:696)
-
at org.springframework.orm.hibernate3.HibernateTemplate.doExecute(HibernateTemplate.java:419)
- .............................(代码偏长,余下的省略掉)
在项目中使用Spring+Hibernate的时候,会开启OpenSessionInViewFilter来阻止延迟加载的错误,但是在我们开启OpenSessionInViewFilter这个过滤器的时候FlushMode就已经被默认设置为了MANUAL,如果FlushMode是MANUAL或NEVEL,在操作过程中 hibernate会将事务设置为readonly,所以在增加、删除或修改操作过程中会出现如下错误
org.springframework.dao.InvalidDataAccessApiUsageException: Write operations are not allowed in read-only mode (FlushMode.NEVER) - turn your Session into FlushMode.AUTO or remove 'readOnly' marker from transaction definition;
解决办法:直接修改OpenSessionInViewFilter过滤器的配置,配置过滤器的时候配置就是在一般的配置里面加上下面部分就可以了,直接指定flushMode的配置就OK了:
- <filter>
-
<filter-name>hibernateFilter</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>
-
<init-param>
-
<param-name>singleSession</param-name>
-
<param-value>true</param-value>
-
</init-param>
-
</filter>
-
<filter-mapping>
-
<filter-name>hibernateFilter</filter-name>
-
<url-pattern>/*</url-pattern>
-
</filter-mapping>
分享到:
相关推荐
1. 当请求到达Controller时,OpenSessionInViewFilter会检查当前线程中是否已经存在Session,如果不存在,它将创建一个新的Session,并绑定到当前线程。 2. 控制器执行业务逻辑,调用DAO进行数据库操作。由于...
在探讨如何通过`OpenSessionInViewFilter`来有效管理Hibernate中的Session生命周期之前,我们需要先理解Session及其生命周期的基本概念。 #### Session与生命周期 在Hibernate框架中,`Session`是执行数据库操作的...
### Open_Session_In_View详解 #### 一、背景与概念 在使用Hibernate进行对象持久化时,经常遇到的一个问题是关于懒加载(lazy loading)的处理。懒加载是一种优化技术,允许在真正需要某个关联对象的数据时才加载...
- 在高并发场景下,需要注意OpenSessionInViewFilter可能会导致的性能问题,因为它使得Session的生命周期变长,增加了Session占用资源的时间。 - 如果项目中同时使用了其他Session管理机制,需要确保它们之间不会...
该模式的核心在于通过Spring提供的`OpenSessionInViewFilter`过滤器,在视图渲染过程中保持Hibernate Session的打开状态,从而简化了事务管理,并避免了一些常见的懒加载异常。 #### 一、OpenSessionInViewFilter...
当使用Open Session In View模式时,如果Session的Flush Mode被设置为NEVER,并且尝试执行写操作(如更新或删除),就会触发“Write operations are not allowed in read-only mode (FlushMode.NEVER)”这个异常。...
当请求处理完毕后,通过`OpenSessionInViewFilter`或`OpenSessionInViewInterceptor`,Session会在合适的时机被自动关闭,释放资源。 `OpenSessionInViewInterceptor`是在Spring的MVC环境中配置的拦截器,它需要在`...
Hibernate提供了Session和Transaction API,用于执行CRUD操作。OpenSessionInView(OSIV)模式是SSH整合中常见的一种优化策略,它在用户的一次HTTP请求过程中保持Hibernate Session,避免了多次打开和关闭Session,...
解决这个问题的方法有两种:一种是在 web.xml 中使用 Spring 提供的 OpenSessionInViewFilter,另一种是在 application.xml 中配置 OpenSessionInViewFilter。前者通用,后者只能用于 SpringMVC 结构中。 最后,...
在这个案例中,Hibernate的SessionFactory可能被Spring管理,通过OpenSessionInViewFilter来保证每个HTTP请求都有一个活跃的Hibernate Session,从而解决延迟加载问题。 OpenSessionInViewFilter是一个重要的组件,...
为了解决这个问题,可以添加`OpenSessionInViewFilter`过滤器,确保在视图渲染期间保持session打开。 5. **分页查询的注意事项** - Hibernate4中,如果你在进行分页查询时遇到“ResultSet may only be accessed in...
当用户发起一个HTTP请求时,OpenSessionInViewFilter会在请求开始时打开一个新的HibernateSession,在请求结束时关闭这个Session,从而确保了在一个请求周期内Session的一致性和事务的完整性。这避免了在业务层手动...
2. **OpenSessionInView模式**: 为了防止Session在请求结束后关闭导致数据丢失,我们可以使用`OpenSessionInViewFilter`。这个过滤器在每次请求开始时打开Session,结束时关闭,保证在整个视图渲染过程中Session都是...
Spring框架下的`OpenSessionInViewFilter`是一个典型例子,只需在`web.xml`中进行配置即可轻松实现。 四、最佳实践与注意事项 - **细粒度控制**:确保Session和事务的控制符合应用的具体需求,避免不必要的资源浪费...
2. **启用OpenSessionInView过滤器**:在web.xml中配置OpenSessionInViewFilter,该过滤器会在HTTP请求开始时开启一个新的Hibernate Session,并在请求结束时提交或回滚事务并关闭Session。 3. **编写业务逻辑**:在...
为了解决这个问题,我们可以使用 Spring 提供的一个支持类OpenSessionInViewFilter,这个类可以在发起一个页面请求时打开 Hibernate 的 Session,并保持这个 Session 的生命周期,直到这个请求结束。这样可以确保 ...
为了解决这个问题,Spring提供了一个过滤器 `OpenSessionInViewFilter` 或者 `OpenSessionInViewInterceptor`,通常简称为OSIV(Open Session In View)模式。 OSIV模式的核心思想是在Controller层和View层之间保持...
配置中包含了`sessionFactoryBeanName`、`singleSession`和`flushMode`等参数,用于指定SessionFactory的bean名称、是否使用单个Session以及flush模式。 在`web.xml`中,Struts2的配置通过`...
在基于Hibernate或其他ORM框架的Spring应用中,由于HTTP请求的无状态性,一次数据库操作可能跨多个方法调用,这就需要数据库会话(Session)在整个请求处理过程中保持打开状态。`OpenSessionInViewFilter`就是为了...
- **`OpenSessionInViewFilter`**:开启Hibernate的Session,在视图渲染完成后关闭Session,确保每个HTTP请求都在同一个Session中执行。 接着是过滤器映射: ```xml <filter-name>hibernate...