Spring与Hibernate整合事务管理的理解
作者:鬼球_Li 发布时间:2023-10-24 16:27:41
在谈Spring事务管理之前我们想一下在我们不用Spring的时候,在Hibernate中我们是怎么进行数据操作的。在Hibernate中我们每次进行一个操作的的时候我们都是要先开启事务,然后进行数据操作,然后提交事务,关闭事务,我们这样做的原因是因为Hibernate默认的事务自动提交是false,他是需要我们人为的手动提交事务,假如你不想每次都手动提交事务的话,你可以在hibernate.cfg.xml我文件中把它设置为事务自动提交:
xml代码
<property name="defaultAutoCommit">
<value>false</value>
</property>
纵然我们把它的事务提交方式设置为自动,它可以进行数据操作,但是这样并不满足我们实际的业务需求,因为有时候在我保存一个数据之后,我希望他能继续保存另一条数据,我希望在保存完两条或者多条之后一起进行事务提交,这样即使出错,我们可以回滚,取保数据的一致性,要么都成功要么都失败,这时候我们就不能每保存完一条数据之后事务就自动提交,因为这样它们不在同一个事务当中,我们不能保证数据的一致行。所以这时候我们就需要手动的来配置我们的事务,这就需要用到Spring为Hibernate提供的事务管理机制,Spring提供的事务管理可以分为两类:编程式的和声明式的,编程式,其实就是在代码里面来控制,像Hibernate操作数据一样,开启事务,提交事务,这种方式有一定的局限性,所以我们一般是用声明式来配置我们的事务。
声明式事务配置主要分以下几步:
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 属性执行。
通过本文希望能帮助大家对Spring 和Hibernate 的整合事务管理的理解,谢谢大家对本站的支持!
来源:http://www.cnblogs.com/guiqiu-Li/p/5895069.html


猜你喜欢
- 哈希表的分离链接法原理Hash Table可以看作是一种特殊的数组。他的原理基本上跟数组相同,给他一个数据,经过自己设置的哈希函数变换得到一
- 1. this 引用1.1 为什么要有this引用先来写一个日期类的例子:public class classCode { &
- 智能指针(smart pointer)是存储指向动态分配(堆)对象指针的类,用于生存期控制
- 模板的定义C++中的模板和泛型编程是非常重要的概念。模板是一种将数据类型作为参数的通用程序设计方法。它们允许开发人员编写可以处理各种数据类型
- Java调用Linux系统命令有时候,我们在使用Java做一些操作时,可能性能上并不能达到我们满意的效果,就拿最近工作中的遇到的一个场景来说
- Android 调用发送短信的方 * 能:调用发送短信功能 1 、 权限 <uses-permission android:name=&
- 详解Android Webview加载网页时发送HTTP头信息当你点击一个超链接进行跳转时,WebView会自动将当前地址作为Referer
- 前序格式<meta-data android:name="weather" android:value="
- 开发 Web 应用的思路实现一个简单的 JSP/Servlet。搭建创建 Web 应用工程的环境。创建 Web 应用工程。Web 应用工程的
- 概述本文介绍通过java程序向PDF文档添加图片,以及替换和删除PDF中已有的图片。另外,关于图片的操作还可参考设置PDF 图片背景、设置P
- WPF 之列表分页控件框架使用大于等于.NET40。Visual Studio 2022。项目使用 MIT 开源许可协议
- 1. 新建项目引入web和security包完整的pom.xml文件如下<?xml version="1.0" e
- 近日在工作中需要根据设备的HardwareID来获取设备的驱动程序信息,比如驱动程序版本等。经过摸索,得到了两种不同的解决办法,两种办法各有
- 前言算法对于程序员的重要性不言而喻,今天我和大家分享算法中的一个基础算法,快速排序。作为一名程序员,相信大家都不陌生,但是要大家徒手一次性写
- AndroidSideMenu能够让你轻而易举地创建侧滑菜单。需要注意的是,该项目自身并不提供任何创建菜单的工具,因此,开发者可以自由创建内
- 前言链表是一种动态的数据结构,因为在创建链表时,不需要知道链表的长度,只需要对指针进行操作。1. 节点的创建 链表的节点包括两部分,分别是:
- 一直到大四才开始写自己的第一篇博客,说来实在有点羞愧。今天写了关于排序的算法题,有插入排序,冒泡排序,选择排序,以下贴上用JAVA实现的代码
- 身为程序员我们对线程是再熟悉不过了,多线程并发算是Java进阶的知识,用好多线程不容易有太多的坑。创建线程也算是一个"重"
- 题目要求为:卡拉兹(Callatz)猜想:对任何一个自然数n,如果它是偶数,那么把它砍掉一半;如果它是奇数,那么把(3n+1)砍掉一半。这样
- 微信登录的实现与qq登录类似。不过微信登录比较麻烦,需要拿到开发者资质认证,花300块钱,然后应用的话还得有官网之类的,就是比较繁琐的前期准