`
gaozzsoft
  • 浏览: 426989 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类

Hibernate事务及Hibernate session FlushMode配置解决方案汇总

阅读更多

Hibernate session FlushMode有五种属性:
1、NEVEL:已经废弃了,被MANUAL取代了
2 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;
解决办法:配置事务,spring会读取事务中的各种配置来覆盖hibernate的session中的FlushMode;
3 AUTO
设置成auto之后,当程序进行查询、提交事务或者调用session.flush()的时候,都会使缓存和数据库进行同步,也就是刷新数据库
4 COMMIT
提交事务或者session.flush()时,刷新数据库;查询不刷新
5 ALWAYS:
每次进行查询、提交事务、session.flush()的时候都会刷数据库
ALWAYS和AUTO的区别:当hibernate缓存中的对象被改动之后,会被标记为脏数据(即与数据库不同步了)。当 session设置为FlushMode.AUTO时,hibernate在进行查询的时候会判断缓存中的数据是否为脏数据,是则刷数据库,不是则不刷,而always是直接刷新,不进行任何判断。很显然auto比always要高效得多。

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

(二)

spring 环境下做一个check*操作时,抛出异常

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.

 

后来发现,由于我在Action中调的方法名是checkXXXXX打头,而我的applicationContext.xml中的相关配置如下:

Xml代码 复制代码
  1. <bean id="transactionInterceptor"  
  2.         class="org.springframework.transaction.interceptor.TransactionInterceptor">  
  3.         <property name="transactionManager" ref="transactionManager" />  
  4.         <property name="transactionAttributes">  
  5.             <props>  
  6.                 <prop key="query*">PROPAGATION_REQUIRED,readOnly</prop>  
  7.                 <prop key="get*">PROPAGATION_REQUIRED,readOnly</prop>  
  8.                 <prop key="find*">PROPAGATION_REQUIRED,readOnly</prop>  
  9.                 <prop key="view*">PROPAGATION_REQUIRED,readOnly</prop>                 
  10.                 <prop key="merge*">PROPAGATION_REQUIRED,readOnly</prop>  
  11.                 <prop key="check*">PROPAGATION_REQUIRED,readOnly</prop>  
  12.                 <prop key="insert*">  
  13.                     PROPAGATION_REQUIRED,-GenericException   
  14.                 </prop>  
<bean id="transactionInterceptor"
		class="org.springframework.transaction.interceptor.TransactionInterceptor">
		<property name="transactionManager" ref="transactionManager" />
		<property name="transactionAttributes">
			<props>
				<prop key="query*">PROPAGATION_REQUIRED,readOnly</prop>
				<prop key="get*">PROPAGATION_REQUIRED,readOnly</prop>
				<prop key="find*">PROPAGATION_REQUIRED,readOnly</prop>
				<prop key="view*">PROPAGATION_REQUIRED,readOnly</prop>				
				<prop key="merge*">PROPAGATION_REQUIRED,readOnly</prop>
				<prop key="check*">PROPAGATION_REQUIRED,readOnly</prop>
				<prop key="insert*">
					PROPAGATION_REQUIRED,-GenericException
				</prop>

 即check打头的操作时,是不可操作数据库的,包括更新与增加数据。

找到原因后将

Xml代码 复制代码
  1. <prop key="check*">PROPAGATION_REQUIRED,readOnly</prop>  
<prop key="check*">PROPAGATION_REQUIRED,readOnly</prop>

 改为

Xml代码 复制代码
  1. <prop key="check*">PROPAGATION_REQUIRED</prop>  
<prop key="check*">PROPAGATION_REQUIRED</prop>

 后,重启服务,问题解决。

 

(三)

<aop:config proxy-target-class="true">
  <aop:pointcut id="managerOperation" expression="execution(* com.yyii.eip..service.*Manager.*(..))"/>  
  <aop:advisor advice-ref="txAdvice" pointcut-ref="managerOperation"/>
  </aop:config>

<!-- 基本事务定义 -->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
  <tx:method name="save*"/>
  <tx:method name="update*"/>
  <tx:method name="remove*"/>
  <tx:method name="delete*"/>
  <tx:method name="create*"/>
  <!-- other methods are set to read only -->  
  <tx:method name="*" read-only="true"/>
</tx:attributes>
</tx:advice>
如果把proxy-target-class="true"去掉, 不会报warn
但如果写上proxy-target-class="true", 2.0的配置依然会报WARN

 

修改web.xml中的]<param-value>false</param-value>为false试试!

<filter>
<filter-name>hibernateFilter</filter-name>
<filter-class>
org.springframework.orm.hibernate3.support.OpenSessionInViewFilter
</filter-class>
<init-param>
<param-name>singleSession</param-name>
<param-value>false</param-value> </init-param>
</filter>

 

 

<!-- 配置事务特性 -->  
  <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.landa.oa.manager.*.*(..))"/>
  <aop:advisor advice-ref="txAdvice" pointcut-ref="allManagerMethod"/>
  </aop:config>

<!--End_rbody_54519835//-->

 

 Exceptions:

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:1112)
 at org.springframework.orm.hibernate3.HibernateTemplate$14.doInHibernate(HibernateTemplate.java:663)

 

 

分享到:
评论

相关推荐

    hibernate错误解决方案

    通过上述对几个常见 Hibernate 错误的解析及解决方法的介绍,我们可以发现大部分问题都与配置文件的设置、实体类的定义以及事务管理有关。在日常开发中,我们应该注意这些细节,以避免不必要的错误发生。同时,对于...

    HIbernate Session 详解

    #### 一、Session在Hibernate中的地位及作用 在Hibernate框架中,`Session` 是一个非常核心且重要的组件。作为Hibernate提供的主要操作数据库的接口,`Session` 不仅承担着保存、更新、删除数据的任务,还负责执行...

    HIBERNATE FOR NETBEANS 数据操作方法

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

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

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

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

    为了解决这个问题,我们需要深入理解Hibernate的工作机制,并掌握一些关键配置和编程技巧。以下是一些详细的知识点: 1. **Hibernate的持久化状态**:Hibernate将实体分为瞬时(Transient)、持久化(Persistent)...

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

    配置中包含了`sessionFactoryBeanName`、`singleSession`和`flushMode`等参数,用于指定SessionFactory的bean名称、是否使用单个Session以及flush模式。 在`web.xml`中,Struts2的配置通过`...

    Hibernate_api

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

    hibernate二级缓存

    2. 配置Hibernate:在hibernate.cfg.xml或对应的配置文件中启用二级缓存,并指定使用的缓存提供商。 3. 配置实体类:在需要缓存的实体类上添加`@Cacheable`和`@Cache`注解,声明该实体类可以被缓存,并可自定义缓存...

    hibernate简单实例

    Hibernate是一款强大的Java持久化框架,它简化了数据库与Java对象之间的交互。对于初学者来说,理解并实践Hibernate的“增删改查”(CRUD)操作是掌握其基本功能的关键步骤。以下是对Hibernate简单实例的详细讲解。 ...

    Hibernate_demo

    4. 对于大数据量的操作,考虑使用批处理,如Session的flushMode和 batchSize属性。 总结,"Hibernate_demo"是一个生动的实例,展示了如何在实际项目中运用Hibernate5。通过分析这个项目,我们可以更好地理解和掌握...

    hibernate学习总结

    **hibernate学习总结** Hibernate 是一款开源的对象关系映射(ORM)框架,它极大地简化了Java应用程序与数据库之间的交互。在Java世界中,Hibernate 提供了一种在对象模型和关系数据库之间进行转换的机制,使得开发...

    hibernate中文参考手册

    4. **会话管理**:Hibernate的Session提供了beginTransaction、commit和rollback方法,用于处理事务。Session的save、update和delete方法用于对象的持久化操作。FlushMode和CacheMode则控制了Session何时将数据同步...

    Hibernate中文教程

    - 解决方案:根据应用场景选择合适的锁机制,并合理配置Hibernate的相关参数。 #### 七、总结 通过本教程的学习,读者能够深入了解Hibernate的工作原理和使用方法,掌握其核心特性和高级功能,从而能够在实际项目...

    Open_Session_In_View详解.doc

    为了解决这一问题,Spring框架提供了`Open Session In View`机制,这是一种简便而有效的解决方案。它能够在Web请求的整个生命周期内保持`Hibernate session`处于打开状态,从而支持懒加载数据的获取,无需在应用层...

    hibernate-note学习笔记

    - **hibernate.cfg.xml**: Hibernate的主要配置文件,包含数据库连接信息、事务管理方式等。 - **xxx.hbm.xml**: 为每个POJO类定义的映射文件,描述了类与数据库表之间的映射关系。 **1.5 ID生成策略** Hibernate...

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

    #### 四、整合中常见的问题及解决方法 **4.1 使用Myeclipse整合时在工程中加入各框架的顺序** 当使用MyEclipse进行整合开发时,建议按照以下顺序添加各个框架的库文件: 1. 添加Struts相关的库文件。 2. 添加...

    hibernate提升性能

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

    快速了解Hibernate中的Session

    - Transaction的`commit()`调用:在提交事务前,若设置为`FlushMode.COMMIT`或`AUTO`,Session会先清除缓存,再执行SQL提交事务。 - 查询操作:`find()`或`iterate()`时,如果对象属性有变动,会先清理缓存以更新...

    Hibernate中Criteria的使用

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

Global site tag (gtag.js) - Google Analytics