Spring中配置Hibernate事务的四种方式
2019独角兽企业重金招聘Python工程师标准>>>
为了保证数据的一致性,在编程的时候往往需要引入事务这个概念。事务有4个特性:原子性、一致性、隔离性、持久性。
事务的种类有两种:编程式事务和声明式事务。编程式事务就是将事务处理放在程序中,而声明式事务则是通过配置文件或者注解进行操作。
在spring中有声明式事务的概念,通过和hibernate类似框架的集成,可以很好的完成声明式事务。
其实,不论在Spring中有几种配置Hibernate事务的方法,都逃不出一下几条:
1.配置SessionFactory
2.配置事务容器
3.配置事务规则
4.配置事务入口
后面一共为大家提供4种配置Hibernate事务的方法。
首先说下配置SessionFactory,配置SessionFactory有两种方式,一种是通过配置hibernate.cfg.xml文件的位置来配置SessionFactory,另一种就是在Spring配置文件中,手动配置数据源。
下面是两种配置SessionFactory的方式(第二种配置需要额外引入两个包:commons-dbcp、commons-pool)
<!-- 1、第一种配置SessionFactory的方式 -->
<
bean
id
=
"sessionFactory"
class
=
"org.springframework.orm.hibernate3.LocalSessionFactoryBean"
>
<
property
name
=
"configLocation"
value
=
"classpath:hibernate.cfg.xml"
/>
</
bean
>
<!-- 2、第二种配置SessionFactory的方式 -->
<!-- 2.1配置数据源 -->
<
bean
id
=
"dataSource"
class
=
"org.apache.commons.dbcp.BasicDataSource"
destroy-method
=
"close"
>
<
property
name
=
"driverClassName"
value
=
"com.mysql.jdbc.Driver"
></
property
>
<
property
name
=
"url"
value
=
"jdbc:mysql://localhost:3306/hibernate_cache"
></
property
>
<
property
name
=
"username"
value
=
"root"
></
property
>
<
property
name
=
"password"
value
=
"admin"
></
property
>
</
bean
>
<!-- 2.2、配置SessionFactory -->
<
bean
id
=
"sessionFactory"
class
=
"org.springframework.orm.hibernate3.LocalSessionFactoryBean"
>
<
property
name
=
"dataSource"
ref
=
"dataSource"
></
property
>
<
property
name
=
"hibernateProperties"
>
<
props
>
<
prop
key
=
"hibernate.hbm2ddl.auto"
>update</
prop
>
</
props
>
</
property
>
<
property
name
=
"mappingLocations"
>
<
list
>
<
value
>classpath:实体对应xml的路径</
value
>
</
list
>
</
property
>
</
bean
>
至此Hibernate就成功的将SessionFactory交给了Spring来管理。现在再来看Spring是怎样管理Hibernate事务的吧。
第一种方式,利用tx标签配置事务。
<!-- 配置事务容器 -->
<
bean
id
=
"transactionManager"
class
=
"org.springframework.orm.hibernate3.HibernateTransactionManager"
>
<
property
name
=
"sessionFactory"
ref
=
"sessionFactory"
/>
</
bean
>
<!-- 定义事务规则 -->
<
tx:advice
id
=
"txAdvice"
transaction-manager
=
"transactionManager"
>
<
tx:attributes
>
<
tx:method
name
=
"add*"
propagation
=
"REQUIRED"
/>
<
tx:method
name
=
"modify*"
propagation
=
"REQUIRED"
/>
<
tx:method
name
=
"del*"
propagation
=
"REQUIRED"
/>
<
tx:method
name
=
"*"
propagation
=
"REQUIRED"
read-only
=
"true"
/>
</
tx:attributes
>
</
tx:advice
>
<!-- 定义事务入口 -->
<
aop:config
>
<
aop:pointcut
id
=
"allDaoMethod"
expression
=
"execution(* com.jianxin.dao.*.*(..))"
/>
<
aop:advisor
advice-ref
=
"txAdvice"
pointcut-ref
=
"allDaoMethod"
/>
</
aop:config
>
第二种,用代理进行配置
<!-- 配置事务容器 -->
<
bean
id
=
"transactionManager"
class
=
"org.springframework.orm.hibernate3.HibernateTransactionManager"
>
<
property
name
=
"sessionFactory"
ref
=
"sessionFactory"
/>
</
bean
>
<!-- 定义事务规则 -->
<
bean
id
=
"transactionProxy"
class
=
"org.springframework.transaction.interceptor.TransactionProxyFactoryBean"
abstract
=
"true"
>
<
property
name
=
"transactionManager"
ref
=
"transactionManager"
/>
<
property
name
=
"transactionAttributes"
>
<
props
>
<!-- ,回滚为-,不回滚为+ -->
<
prop
key
=
"add*"
>PROPAGATION_REQUIRED,-Exception</
prop
>
<
prop
key
=
"modify*"
>PROPAGATION_REQUIRED,+MyException</
prop
>
<
prop
key
=
"del*"
>PROPAGATION_REQUIRED</
prop
>
<
prop
key
=
"*"
>READONLY</
prop
>
</
props
>
</
property
>
</
bean
>
<!-- 定义事务入口 -->
<
bean
id
=
"userDaoProxy"
parent
=
"transactionProxy"
>
<
property
name
=
"target"
ref
=
"userDao"
></
property
>
</
bean
>
第三种,利用拦截器
<!-- 配置事务容器 -->
<
bean
id
=
"transactionManager"
class
=
"org.springframework.orm.hibernate3.HibernateTransactionManager"
>
<
property
name
=
"sessionFactory"
ref
=
"sessionFactory"
/>
</
bean
>
<!-- 定义事务规则 -->
<
bean
id
=
"transactionInterceptor"
class
=
"org.springframework.transaction.interceptor.TransactionInterceptor"
>
<
property
name
=
"transactionManager"
ref
=
"transactionManager"
/>
<
property
name
=
"transactionAttributes"
>
<
props
>
<!-- 回滚为-,不回滚为+ -->
<
prop
key
=
"add*"
>PROPAGATION_REQUIRED,-Exception</
prop
>
<
prop
key
=
"modify*"
>PROPAGATION_REQUIRED,+MyException</
prop
>
<
prop
key
=
"del*"
>PROPAGATION_REQUIRED</
prop
>
<
prop
key
=
"*"
>READONLY</
prop
>
</
props
>
</
property
>
</
bean
>
<!-- 定义事务入口 -->
<
bean
id
=
"proxyFactory"
class
=
"org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator"
>
<
property
name
=
"interceptorNames"
>
<
list
>
<
value
>transactionInterceptor</
value
>
</
list
>
</
property
>
<
property
name
=
"beanNames"
>
<
list
>
<
value
>*Dao</
value
>
</
list
>
</
property
>
<!--使用接口时-->
<property name="proxyTargetClass">
<value>true</value>
</property>
</
bean
>
第四种,利用注解。
<!-- 开户事务注解功能 -->
<
tx:annotation-driven
transaction-manager
=
"transactionManager"
/>
首先,在配置文件中写入下面语句,打开注解功能
然后用@Transactional对类或者方法进行标记,如果标记到类上,那么次类中所有方法都进行事务回滚处理,在类中定义Transactional的时候,它有propagation、rollbackFor、noRollbackFor等属性,此属性是用来定义事务规则,而定义到哪这个就是事务入口。
纵观以上四种在Spring中配置Hibernate事务的方法,其核心都是一样的,不同的只是实现的方式而已。所以看到这,这篇博文中你只需要记住4句话,就可以轻松理解在Spring中配置Hibernate事务的核心:
1.配置SessionFactory
2.配置事务容器
3.配置事务规则
4.配置事务入口
转载于:https://my.oschina.net/dreamerliujack/blog/847737
Spring中配置Hibernate事务的四种方式相关推荐
- Spring中配置DataSource数据源的几种选择
Spring中配置DataSource数据源的几种选择 在Spring框架中有如下3种获得DataSource对象的方法: 从JNDI获得DataSource. 从第三方的连接池获得DataSourc ...
- java配置文件实现方式_java相关:详解Spring加载Properties配置文件的四种方式
java相关:详解Spring加载Properties配置文件的四种方式 发布于 2020-4-29| 复制链接 摘记: 一.通过 context:property-placeholder 标签实现配 ...
- spring加载ApplicationContext.xml的四种方式
spring加载ApplicationContext.xml的四种方式 spring 中加载xml配置文件的方式,好像有4种, xml是最常见的spring 应用系统配置源.Spring中的几种容器都 ...
- 用spring管理和实例化对象的四种方式
用spring管理和实例化对象的四种方式 方式一:无参构造函数(最常用) 对象是spring创建,创建的对象还要交给spring容器管理 bean:豆子 id:在spring容器中Hello对象的名, ...
- Spring IOC (DI) 依赖注入的四种方式
依赖注入的四种方式: set 注入 赋值,默认使用的是set() 方法,依赖注入底层是通过反射实现的 <bean id="student" class="cust. ...
- JavaScript中字符串连接/拼接的四种方式
JavaScript中连接字符串的方式有4种,分别是使用加号运算符连接.使用${}配合反引号连接.使用concat()函数连接.使用join()函数连接. 1. 使用加号运算符 示例代码如下: let ...
- Java中数组转List的四种方式
第一种方式(未必最佳):使用ArrayList.asList(strArray) 使用Arrays工具类Arrays.asList(strArray)方式,转换完成后,只能对List数组进行查改,不能 ...
- 【Spring】Spring的IOC依赖注入的四种方式
作者简介:大家好,我是五度鱼,一个普通的Java领域博主,不停输出Java技术博客和干货. 座右铭:锲而不舍,金石可镂. 个人主页:五度鱼学Java的主页 文章目录 前言 1. set注入 2. 构造 ...
- Android开发中配置JDK环境的几种方式
文章目录 一.前言 二.IDE设置 三.环境变量 四.gradle中配置 五.参考链接 一.前言 在Android开发中,配置JDK环境有以下几种方式来是Android项目正常编译 - changin ...
最新文章
- Windows下安装Memcached
- java记事本应用程序_Java教程:使用记事本编写运行Java程序
- python(numpy,pandas7)——pandas的数据选择
- c++ primer 5th 练习11.9自己编写的答案
- Netty学习笔记(六)Pipeline的传播机制
- KlayGE 4.0中Deferred Rendering的改进(四):GI的神话
- 2010 本年度认证目标:坐沙发的熊
- ebs 供应商地点信息_供应商,地址,业务实体,地点关联银行账户
- 【图像处理】灰度加权距离变换(GWDT)
- Macaca自动化测试Android和IOS应用
- 南京林业大学883数据结构本校资料
- 15.4.1 使用CREATE OR REPLACE VIEW语句修改视图结构
- 自有服务器网站备案,网站放自己服务器备案
- 前端的一些实用算法题
- vue实现调查问卷一页一题,上一题下一题形式
- 计算机文件与桌面文件同步,电脑文件同步到手机的技巧
- elementUI el-date-picker表单组件
- c语言字符串输入的陷阱
- 蓝桥杯单片机关闭蜂鸣器、继电器LED及数码管
- B类网络计算子网IP范围和掩码
热门文章
- 基础练习 高精度加法(蓝桥杯 java)
- 求解最长回文子串----Manacher 算法
- 南邮计算机专硕考研专业课,南京邮电大学(专业学位)计算机技术研究生考试科目和考研参考书目...
- android 获取phone实例,android – 可以通过sdk来实例化一个telephony.Phone对象吗?
- android 翻转切换view,Android ViewFlipper翻转视图使用详解
- pandas 合并所有列_Python学习:Pandas库
- cmd批量修改文件名 增加文字_Dynamo自动批量化修改文件名称
- typescript语法高亮插件_vscode常用插件
- jQuery中的ajax、jquery中ajax全局事件、load实现页面无刷新局部加载、ajax跨域请求jsonp、利用formData对象向服务端异步发送二进制数据,表单序列化(异步获取表单内容)
- Linux中cp和scp命令的使用方法和区别