Spring对Hibernate的session生效期(事物提交管理)介绍

  在Hibernate中我们每次进行一个操作的的时候我们都是要先开启事务,然后进行数据操作,然后提交事务,关闭事务,这样做的原因是因为Hibernate默认的事务自动提交是false,它是需要人为的手动提交事务,假如你不想每次都手动提交事务的话,你可以在hibernate.cfg.xml我文件中把它设置为事务自动提交:

<propertyname="hibernate.connection.autocommit">true</property>

  当我们Spring对我们的Hibernate进行整合之后,我们的代码又出现了什么变化呢?

  整合,之后,我们不再是每次都去拿Session进行数据操作了,也不需要每次都开启事务,提交事务了,我们只需要Spring给我们提供的一个HibernateTemplate,我们直接用这个类里面给我们提供的数据操作方法就可以操作数据了。我们在也看不到关于事务的代码了。

  那Spring究竟有没有在他的操作方法里面封装事务处理呢?有的人直接 HibernateTemplate里面提供的方法操作数据,成功了,有的人却又失败了,这到底是怎么回事呢?

  其实这里要看我们是怎样集成我们的 Hibernate和Spring

  1.如果在集成的过程中,我们抛弃了hibernate.cfg.xml文件,直接在Spring的的配置文件中进行配置数据源的话,那你直接用HibernateTemplate里面提供的方法是可以成功操作数据的.

  2.如果你还是用hibernate.cfg.xml来配置数据源,在Spring的配置文件中引用hibernate.cfg.xml文件,那么你不能成功,这其中的原因就是因为如果你用 hibernate.cfg.xml文件配置数据源,就像我们前面说的,Hibernate默认是手动提交事务,而HibernateTemplatel 提供的方法里面并没有提供事务提交,而如果你用Spring的配置文件来配置数据源,Sping默认是自动提交的,所以就会成功,如果你想把Spring 设置为手动提交你可以在起配置文件中进行配置:

<property name="defaultAutoCommit">
  <value>false</value>
</property>

  纵然我们把它的事务提交方式设置为自动,它可以进行数据操作,但是这样并不满足我们实际的业务需求,因为有时候在我保存一个数据之后,我希望他能继续保存另一条数据,我希望在保存完两条或者多条之后一起进行事务提交,这样即使出错,我们可以回滚,取保数据的一致性,要么都成功要么都失败,这时候我们就不能每保存完一条数据之后事务就自动提交,因为这样它们不在同一个事务当中,我们不能保证数据的一致行。所以这时候我们就需要手动的来配置我们的事务,这就需要用到Spring为Hibernate提供的事务管理机制,Spring提供的事务管理可以分为两类:编程式的和声明式的,编程式,其实就是在代码里面来控制,像Hibernate操作数据一样,开启事务,提交事务,这种方式有一定的局限性,所以我们一般是用声明式来配置我们的事务。

  

  一下对spring的食物简单关联下,具体详情和使用查看spring的事物管理帖子

  声明式事务配置主要分以下几步:

1、声明式事务配置

(1) 配置事务管理器;

(2)事务的传播特性;

(3)那些类那些方法使用事务。

<!-- 配置事务管理器 指定其作用的sessionFactory把事务交给Spring去处理 -->

<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
  <property name="sessionFactory">
      <ref bean="sessionFactory"/>
  </property>
</bean>

<!-- 配置事务的传播特性 -->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="save*" propagation="REQUIRED"/>
<tx:method name="delete*" propagation="REQUIRED"/>
<tx:method name="update*" propagation="REQUIRED"/>
<tx:method name="get*" read-only="true" propagation="NOT_SUPPORTED"/>
<tx:method name="*" read-only="true"/>
</tx:attributes>
</tx:advice>

<!-- 那些类的哪些方法参与事务 -->
<aop:config>
  <aop:pointcut id="allServiceMethod" expression="execution(* com.coe.service.*.*(..))"/>
  <aop:advisor pointcut-ref="allServiceMethod" advice-ref="txAdvice"/>
</aop:config>

  我们在配置事务的时候,我们一般是把事务边界设置到service层,也就是你的业务逻辑层,因为我们很多时候都是在我们的业务逻辑层来完成我们一些列的数据操作,如果放到Dao数据层,其粒度太小了。另外,如果我们把事务配置在业务逻辑层的话,对我们的二级缓存也是有好处的,这个大家以后实际操作的时候会发现。

2、编写业务逻辑方法

  这时候我们就可以在我们业务逻辑层用HibernateTemplate里面提供的数据操作方法来编写我们的业务逻辑方法了,当然我们的方法必须要是以我们事务配置里面配置的一样,用save,delete,update,get做我们的方法的开头。需要注意的是,默认情况下运行期异常才会回滚(包括继承了RuntimeException子类),普通异常是不会滚的。

最后我们顺便总结一下事务的几种传播特性:

1. PROPAGATION_REQUIRED: 如果存在一个事务,则支持当前事务。如果没有事务则开启;

2. PROPAGATION_SUPPORTS: 如果存在一个事务,支持当前事务。如果没有事务,则非事务的执行;

3. PROPAGATION_MANDATORY: 如果已经存在一个事务,支持当前事务。如果没有一个活动的事务,则抛出异常;

4. PROPAGATION_REQUIRES_NEW: 总是开启一个新的事务。如果一个事务已经存在,则将这个存在的事务挂起;

5. PROPAGATION_NOT_SUPPORTED: 总是非事务地执行,并挂起任何存在的事务;

6. PROPAGATION_NEVER: 总是非事务地执行,如果存在一个活动事务,则抛出异常;

7. PROPAGATION_NESTED:如果一个活动的事务存在,则运行在一个嵌套的事务中. 如果没有活动事务, 则按TransactionDefinition.PROPAGATION_REQUIRED 属性执行。
时间: 2024-12-18 11:25:53

Spring对Hibernate的session生效期(事物提交管理)介绍的相关文章

spring与hibernate整合配置基于Annotation注解方式管理实务

1.配置数据源 数据库连接基本信息存放到properties文件中,因此先加载properties文件 1 <!-- jdbc连接信息 --> 2 <context:property-placeholder 3 location="classpath:io/shuqi/ssh/spring/transactionalAnnotation/jdbc.properties"/> 使用DBCP数据源配置xml如下 1 <!-- dbcp数据源配置 -->

轻量级Java EE企业应用实战(第4版):Struts 2+Spring 4+Hibernate整合开发(含CD光盘1张)

轻量级Java EE企业应用实战(第4版):Struts 2+Spring 4+Hibernate整合开发(含CD光盘1张)(国家级奖项获奖作品升级版,四版累计印刷27次发行量超10万册的轻量级Java EE经典著作) 李刚 编著   ISBN 978-7-121-24253-3 2014年10月出版 定价:108.00元 824页 16开 编辑推荐 国内知名IT图书作家李刚老师基于曾荣获中国书刊发行业协会“年度全行业优秀畅销品种”大奖的<轻量级Java EE企业应用实战(第3版)>全新升级:

Spring对hibernate的事物管理

把Hibernate用到的数据源Datasource,Hibernate的SessionFactory实例,事务管理器HibernateTransactionManager,都交给Spring管理.一.事务的4个特性:   原子性:一个事务中所有对数据库的操作是一个不可分割的操作序列,要么全做,要么全部做.   一致性:数据不会因为事务的执行而遭到破坏.   隔离性:一个事务的执行,不受其他事务(进程)的干扰.既并发执行的个事务之间互不干扰.   持久性:一个事务一旦提交,它对数据库的改变将是永

Spring MVC + Hibernate + Maven: Crud操作示例

Alexey是一个在使用Java,TestNG 和Selenium的自动化WEB应用程序中有丰富经验的测试开发者.他如此的喜欢QA以至于在下班后他为初级QA工程师提供培训课程. 在这篇文章中我想介绍一个Spring MVC + Hibernate + Maven例子.这组技术主要涉及一些基础知识,我想在每一个必要的地方详细解释它.本篇话题范围以外的更多资源,我会提供链接方便你阅读.在文章的最后,我将发布一个GitHub的链接. 目标 示例web应用程序是基于Spring MVC, Hiberna

hibernate中session的获取使用以及其他注意事项

hibernate中session的获取使用以及其他注意事项 前言:工作时,在同时使用Hibernate的getSession().getHibernateTemplate()获取Session后进行数据查询时不是出现了"session is close"异常就是出现其他异常问题,痛定思痛,决定收集并整理相关资料,方便今后的使用. 一.session的获取 在hibernate中的Session对象通过SessionFactory来管理,可以通过使用openSession ().get

Spring+Struts+Hibernate 简介(转)

http://blog.csdn.net/slnqnd/article/details/1772910/ Struts2.0 +Hibernate 3.2 +Spring 2.0 一.        Struts 1.定义 它是使用 servlet 和 JavaServer Pages 技术的一种 Model-View-Controller 实现, 可帮助您控制Web 项目中的变化并提高专业化水平.“模型-视图-控制 器”(MVC) 就是用来帮助您控制变化的一种设计模式.MVC 减弱了业务逻辑接

简单Spring+Struts2+Hibernate框架搭建

使用Maven+Spring+Struts2+Hibernate整合 pom文件 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd

Spring整合hibernate(1)之基础整合

Spring整合hibernate3之基础整合 Spring集成hibernate3和4有一定的区别,目前基本都在使用3,所以此处内容以3为基础: 1.导入hibernate的包和Spring的包 1.1.导入Spring的依赖包 1.2.导入Log4j的依赖包:log4j-1.2.16.jar 1.3.导入dbcp的依赖包:commons-dbcp-1.4.jar.commons-pool-1.5.6.jar 1.4.导入hibernate3的依赖包 hibernate全部版本地址:http:

使用Maven 整合Spring和hibernate 适合初级接触的学者

本文,主要介绍Spring 和 hibernate怎么去整合,废话就不多说了,如果不知道spring 和hibernate 是干嘛的,还请去问问度娘哈.下面开始一步一步搭建: 工具: Idea 一.先搭建Spring 1.新建一个maven项目:至于填写项目名称什么的就不一一介绍了 这里我的idea没有自动生成test文件夹,需要大家自己建一下,之后的项目目录如下图所示: 2.下面我贴出项目的Pom文件: <project xmlns="http://maven.apache.org/PO