`
阅读更多
[color=green][/color]
在保存实体对象的时候出现一下错误
错误提示: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的缘故
OpenSessionInViewFilter在web.xml中的配置如下:
<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>/*</url-pattern>
  </filter-mapping>

首先说明OpenSessionInViewFilter的作用是:允许在每次的整个request的过程中使用同一个hibernate session,可以在这个request任何时期延迟加载数据(hibernate延迟加载)。即实现了spring对session的管理,又实现了hibernate的延迟加载,一句两得的事情,多好
但是OpenSessionInViewFilter默认是不会对session 进行flush的,并且flush mode 是 never
代码:
protected Session getSession(SessionFactory sessionFactory) 
                  throws DataAccessResourceFailureException {
       Session session = SessionFactoryUtils.getSession  (sessionFactory, true);
       session.setFlushMode(FlushMode.NEVER);
       return session;
    }
看getSession的方式就知道,把flush mode 设为FlushMode.NEVER,这样就算是commit的时候也不会session flush, 如果想在完成request过程中更新数据的话, 那就需要先把flush model设为FlushMode.AUTO,再在更新完数据后flush.
解决方法:使用spring的事物管理机制(spring2.0及以后版本)
<!-- 配置事务管理器 -->
<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory">
    <ref local="sessionFactory"/>
         </property>
</bean>
     <!-- 配置事务特性 -->      
<tx:advice id="txAdvice" transaction-manager="transactionManager">
    <tx:attributes>
    <tx:method name="add*" propagation="REQUIRED"/>
    <tx:method name="del*" propagation="REQUIRED"/>
    <tx:method name="update*" propagation="REQUIRED"/>
    <tx:method name="*" read-only="true"/>
    </tx:attributes>
</tx:advice>
   
    <!-- 配置那些类的方法进行事务管理 -->
<aop:config>
    <aop:pointcut id="allManagerMethod"
         expression="execution (* com.cyf.oa.managers.*.*(..))"/>
    <aop:advisor advice-ref="txAdvice"
         pointcut-ref="allManagerMethod"/>
</aop:config>

还有一点就是方法名的问题,方法名字一定要与事物配置声明的方法名对应,一定要以add,del或者update开头,要不然这些配置对你那方法是不起作用的。、
这些都是spring,hibernate对我们的方法进行了控制,在调用某种方法前,进行了验证,过滤。帮助我们管理事物。


分享到:
评论

相关推荐

    关于OpenSessionInViewFilter的学习

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

    懒加载异常解决.docx

    - 在高并发场景下,需要注意OpenSessionInViewFilter可能会导致的性能问题,因为它使得Session的生命周期变长,增加了Session占用资源的时间。 - 如果项目中同时使用了其他Session管理机制,需要确保它们之间不会...

    过滤器对于session周期的控制

    在探讨如何通过`OpenSessionInViewFilter`来有效管理Hibernate中的Session生命周期之前,我们需要先理解Session及其生命周期的基本概念。 #### Session与生命周期 在Hibernate框架中,`Session`是执行数据库操作的...

    Spring hibernate opensessioninview

    该模式的核心在于通过Spring提供的`OpenSessionInViewFilter`过滤器,在视图渲染过程中保持Hibernate Session的打开状态,从而简化了事务管理,并避免了一些常见的懒加载异常。 #### 一、OpenSessionInViewFilter...

    Spring提供的CharacterEncoding和OpenSessionInView功能

    在处理Web应用时,Spring提供了一些关键特性,如`CharacterEncodingFilter`和`OpenSessionInViewFilter`,它们对于解决特定问题至关重要。 首先,让我们深入了解一下`CharacterEncodingFilter`。在Web应用中,字符...

    spring监听器

    ### Spring监听器与过滤器详解...- **Spring Web环境下的监听器和过滤器**:在Spring MVC环境中,除了上述提到的OpenSessionInViewFilter和CharacterEncodingFilter,还有多种其他类型的过滤器和监听器可以使用,例如`...

    使用Spring引起的错误

    2. **OpenSessionInViewFilter**:通过Web容器的过滤器(filter)来实现。 #### 异常原因 当使用Open Session In View模式时,如果Session的Flush Mode被设置为NEVER,并且尝试执行写操作(如更新或删除),就会触发...

    ssh基本配置过程,是struts2的

    在`web.xml`中配置Spring监听器以初始化Spring容器,并添加`OpenSessionInViewFilter`以解决懒加载问题: ```xml &lt;listener-class&gt;org.springframework.web.context.ContextLoaderListener &lt;filter-name&gt;...

    Hibernate事务管理.

    当请求处理完毕后,通过`OpenSessionInViewFilter`或`OpenSessionInViewInterceptor`,Session会在合适的时机被自动关闭,释放资源。 `OpenSessionInViewInterceptor`是在Spring的MVC环境中配置的拦截器,它需要在`...

    SSH2.0配置日记

    在 OpenSessionInViewFilter 中,需要配置 Hibernate 的 Session 管理,以便实现 Hibernate 的 Session 的打开和关闭。 9. web.xml 配置 在 web.xml 文件中,需要配置 Servlet 监听器、上下文变量、Filter 等,...

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

    在`web.xml`中,Struts2的配置通过`StrutsPrepareAndExecuteFilter`进行,而Spring与Hibernate的集成则通过`OpenSessionInViewFilter`实现。这些配置保证了请求到达时,Struts2能正确处理请求,同时Spring能够管理和...

    S2SH集成 案例

    这个案例提供了一个基础的登录功能,同时展示了S2SH集成的各个方面,包括OpenSessionInViewFilter的使用、声明式事务管理以及三层架构的设计。 首先,让我们从Struts2开始。Struts2作为控制层,负责处理HTTP请求,...

    S2SH的配置

    &lt;filter-class&gt;org.springframework.orm.hibernate3.support.OpenSessionInViewFilter ``` - **`OpenSessionInViewFilter`**:开启Hibernate的Session,在视图渲染完成后关闭Session,确保每个HTTP请求都在同一个...

    spring框架中常用的配置

    Spring框架还提供了一系列的过滤器来处理Web应用中的请求,例如OpenSessionInViewFilter用于解决Hibernate懒加载问题。 - **OpenSessionInViewFilter**:此过滤器在请求处理开始时打开一个Hibernate会话,在请求...

    SSH框架ajax获取的json格式数据处理过程

    在这里,我们使用了 OpenSessionInViewFilter 来实现 Hibernate 的 Session 的管理。同时,我们还使用了 JQuery 库来实现 JSON 数据的处理。 五、CSS 样式表的实现 在 CSS 样式表中,我们使用了 cursor:pointer ...

    ssh配置文件

    - **Hibernate会话管理过滤器**:OpenSessionInViewFilter确保在每个请求的生命周期内保持一个打开的Hibernate Session,从而实现懒加载: ```xml &lt;filter-name&gt;OpenSessionInViewFilter &lt;filter-class&gt;org....

    SSH整合的简单操作

    - 在`web.xml`中设置Spring的`ContextLoaderListener`监听器加载上下文,以及`OpenSessionInViewFilter`过滤器,确保每个请求都有一个打开的Session。 - 配置Struts2的Filter,确保请求匹配`.action`结尾的URL,...

    SSH整合文档

    2. **OpenSessionInView模式**: 为了防止Session在请求结束后关闭导致数据丢失,我们可以使用`OpenSessionInViewFilter`。这个过滤器在每次请求开始时打开Session,结束时关闭,保证在整个视图渲染过程中Session都是...

    spring学习笔记

    - **解决方案**:使用 OpenSessionInViewFilter 过滤器,在请求开始时打开 Session,并在请求结束时关闭 Session。 2. **DAO层**:使用 Hibernate 来实现数据访问操作。 3. **业务层**:利用 Spring 的依赖注入和...

Global site tag (gtag.js) - Google Analytics