`

关于spring+hibernate的FlushMode的记录

 
阅读更多

参见hibernate的api说明https://www.hibernate.org/hib_docs/v3/api/org/hibernate/FlushMode.html

说明FlushMode有五种属性

NEVEL   

已经废弃了,被MANUAL取代了


2 MANUAL  

spring3.x中的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;
解决办法网上有很多;
1 配置事务,spring会读取事务中的各种配置来覆盖hibernate的session中的FlushMode;
2 先编程式修改FlushMode,比如session.setFlushMode(FlushMode.AUTO); 这样hibernate就会自动去除readonly限制;
3 直接修改opensessioninviewfilter过滤器的配置,配置过滤器的时候配置
<filter>
      <filter-name>openSession</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>

3 AUTO

设置成auto之后,当程序进行查询、提交事务或者调用session.flush()的时候,都会使缓存和数据库进行同步,也就是刷新数据库

4 COMMIT

提交事务或者session.flush()时,刷新数据库;查询不刷新


5 ALWAYS

每次进行查询、提交事务、session.flush()的时候都会刷数据库
这里需要说一下和AUTO的区别,当hibernate缓存中的对象被改动之后,会被标记为脏数据(即与数据库不同步了)。当session设置为FlushMode.AUTO时,hibernate在进行查询的时候会判断缓存中的数据是否为脏数据,是则刷数据库,不是则不刷,而always是直接刷新,不进行任何判断。很显然auto比always要高效得多。

转自:http://www.blogjava.net/landor2004/archive/2009/11/25/303701.html

分享到:
评论

相关推荐

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

    Struts2、Spring和Hibernate是Java开发中的三大框架,它们的集成能够构建出强大的企业级应用。在这个配置说明中,开发者使用的是Struts2.3、Spring3.1.2和Hibernate4.1.6的版本。 首先,我们需要了解这三大框架的...

    hibernate错误解决方案

    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 ...

    Struts1.x Spring2.x Hibernate3.x DWR2.x整合工具文档v1.00

    ### Struts1.x、Spring2.x、Hibernate3.x 和 DWR2.x 整合知识点解析 #### 一、Struts1.x与Spring2.x的整合 **1.1 在web.xml中进行Struts和Spring的配置** 为了实现Struts1.x与Spring2.x的无缝集成,首先需要在...

    Hibernate3.5官方开发文档pdf + html

    12. **事务管理**:讲解Hibernate的事务API,包括Transaction接口和FlushMode,以及如何与其他事务管理机制(如JTA)集成。 13. **事件监听器**:学习如何使用Hibernate事件系统来实现定制的行为,如预加载、预更新...

    hibernate学习总结

    - `flushMode`控制何时与数据库同步数据。 - `hibernate.show_sql`开启SQL日志,便于调试。 ### 9. Criteria与Querydsl结合 Querydsl 是一个强大的查询构造工具,可以与Hibernate Criteria API 结合,提供类型安全...

    spring_demo:Spring MVC示范项目

    Spring MVC Hibernate Demo Hibernate 配置 数据库实体必须设置以下注解 @Entity @Id 自增主键必须设置以下注解,否则报错 @GeneratedValue(strategy = GenerationType.IDENTITY) 在更新或删除数据时,必须调用...

    使用Spring引起的错误

    在使用Spring框架时,特别是在与Hibernate结合的情况下,可能会遇到“Write operations are not allowed in read-only mode (FlushMode.NEVER)”这样的异常。这个问题通常发生在使用Spring提供的Open Session In ...

    HIBERNATE FOR NETBEANS 数据操作方法

    - 使用批处理操作,通过`Session`的`flushMode`和` batchSize`设置优化性能。 通过以上步骤,你可以在NetBeans中高效地利用Hibernate进行数据操作。这个过程简化了数据库操作,使得开发者可以专注于业务逻辑,而...

    Hibernate_api

    - Spring框架集成:Spring提供了对Hibernate的支持,简化了配置和事务管理。 - JPA集成:Hibernate作为JPA的实现,可以使用JPA规范进行开发。 总结,Hibernate API 是Java开发者处理数据库的强大工具,它简化了...

    hibernate二级缓存

    **hibernate二级缓存详解** 在Java的持久化框架Hibernate中,缓存是一种重要的优化手段,它能够显著提升数据库操作的效率。本项目提供的工程示例深入探讨了Hibernate的一级缓存和二级缓存机制,并通过实际运行验证...

    SSH整合环境 配置

    在Java Web开发中,SSH(Struts2、Spring和Hibernate)是一个常见的集成框架,用于构建高效、可扩展的Web应用程序。SSH整合涉及三个核心组件:Struts2负责控制层,Spring处理业务逻辑和依赖注入,而Hibernate则管理...

    hibernate简单实例

    - 使用批处理:通过`flushMode`和`batch-size`设置,可以批量处理多个操作,提高效率。 - 只获取必要的数据:避免加载整个实体,使用`select new`构造函数或`fetch`属性限制关联关系的加载。 - 利用缓存:根据...

    hibernate中文参考手册

    以上只是《Hibernate中文参考手册》的部分内容概览,具体手册中还包含了更多关于实体状态管理、性能优化、类型转换、CGLIB和JPA支持等深入细节。通过详细阅读和实践,开发者可以全面掌握Hibernate的使用,提升Java...

    如何解决hibernate自动更新实体类的问题共5页.pd

    在使用Hibernate进行Java开发时,有时会遇到一个常见的问题,即Hibernate自动更新实体类的问题。这个问题通常发生在我们从数据库加载一个实体对象,对其进行修改,但并没有显式地调用`save()`或`update()`方法,然而...

    Hibernate_demo

    《深入理解Hibernate5:基于Hibernate_demo的实践指南》 Hibernate作为一个强大的对象关系映射(ORM)框架,一直以来都是Java开发者的重要工具。本文将基于提供的"Hibernate_demo"项目,深入探讨Hibernate5的核心...

    Hibernate中Criteria的使用

    Criteria 和 DetachedCriteria 都可以使用Criterion 和 Projection 设置查询条件,可以设置 FetchMode(联合查询抓取的模式)、设置排序方式,对于 Criteria 还可以设置 FlushMode(冲刷 Session 的方式)和 ...

    hibernate-note学习笔记

    - **FlushMode**: 控制Session何时执行flush操作。 #### 五、级联操作 - **级联保存**(cascade save): 在保存一个对象时,同时保存其关联对象。 - **级联删除**(cascade delete): 删除一个对象时,同时删除其关联...

    HIbernate Session 详解

    这些集合共同组成了 `Session` 的缓存机制,确保了在 `Session` 生命周期内,每个持久化对象都有一份副本存在于缓存中,并且可以通过这些副本追踪到数据库中的实际记录。 #### 三、Session缓存的作用 1. **减少...

    hibernate提升性能

    例如,`Session.flushMode()`和`Session.setBatchSize()`方法。 2. 延迟加载:Hibernate的懒加载机制可以降低内存消耗,但过多的延迟加载可能导致大量小查询,增加数据库压力。合理设计实体关系,适时使用立即加载...

Global site tag (gtag.js) - Google Analytics