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的方式 -->

<beanid="sessionFactory"

    class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">

    <propertyname="configLocation"value="classpath:hibernate.cfg.xml"/>

</bean>

<!-- 2、第二种配置SessionFactory的方式 -->

<!-- 2.1配置数据源 -->

<beanid="dataSource"class="org.apache.commons.dbcp.BasicDataSource"

    destroy-method="close">

    <propertyname="driverClassName"value="com.mysql.jdbc.Driver"></property>

    <propertyname="url"value="jdbc:mysql://localhost:3306/hibernate_cache"></property>

    <propertyname="username"value="root"></property>

    <propertyname="password"value="admin"></property>

</bean>

<!-- 2.2、配置SessionFactory -->

<beanid="sessionFactory"

    class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">

    <propertyname="dataSource"ref="dataSource"></property>

    <propertyname="hibernateProperties">

        <props>

            <propkey="hibernate.hbm2ddl.auto">update</prop>

        </props>

    </property>

    <propertyname="mappingLocations">

        <list>

            <value>classpath:实体对应xml的路径</value>

        </list>

    </property>

</bean>

至此Hibernate就成功的将SessionFactory交给了Spring来管理。现在再来看Spring是怎样管理Hibernate事务的吧。

第一种方式,利用tx标签配置事务。

<!-- 配置事务容器 -->

<beanid="transactionManager"

    class="org.springframework.orm.hibernate3.HibernateTransactionManager">

    <propertyname="sessionFactory"ref="sessionFactory"/>

</bean>

<!-- 定义事务规则 -->

<tx:adviceid="txAdvice"transaction-manager="transactionManager">

    <tx:attributes>

        <tx:methodname="add*"propagation="REQUIRED"/>

        <tx:methodname="modify*"propagation="REQUIRED"/>

        <tx:methodname="del*"propagation="REQUIRED"/>

        <tx:methodname="*"propagation="REQUIRED"read-only="true"/>

    </tx:attributes>

</tx:advice>

<!-- 定义事务入口 -->

<aop:config>

    <aop:pointcutid="allDaoMethod"expression="execution(* com.jianxin.dao.*.*(..))"  />

    <aop:advisoradvice-ref="txAdvice"pointcut-ref="allDaoMethod"/>

</aop:config>

第二种,用代理进行配置

<!-- 配置事务容器 -->

<beanid="transactionManager"

    class="org.springframework.orm.hibernate3.HibernateTransactionManager">

    <propertyname="sessionFactory"ref="sessionFactory"/>

</bean>

<!-- 定义事务规则 -->

<beanid="transactionProxy"

    class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"

    abstract="true">

    <propertyname="transactionManager"ref="transactionManager"/>

    <propertyname="transactionAttributes">

        <props>

            <!-- ,回滚为-,不回滚为+ -->

            <propkey="add*">PROPAGATION_REQUIRED,-Exception</prop>

            <propkey="modify*">PROPAGATION_REQUIRED,+MyException</prop>

            <propkey="del*">PROPAGATION_REQUIRED</prop>

            <propkey="*">READONLY</prop>

        </props>

    </property>

</bean>

<!-- 定义事务入口 -->

<beanid="userDaoProxy"parent="transactionProxy">

    <propertyname="target"ref="userDao"></property>

</bean>

第三种,利用拦截器

<!-- 配置事务容器 -->

<beanid="transactionManager"

    class="org.springframework.orm.hibernate3.HibernateTransactionManager">

    <propertyname="sessionFactory"ref="sessionFactory"/>

</bean>

<!-- 定义事务规则 -->

<beanid="transactionInterceptor"

    class="org.springframework.transaction.interceptor.TransactionInterceptor">

    <propertyname="transactionManager"ref="transactionManager"/>

    <propertyname="transactionAttributes">

        <props>

            <!-- 回滚为-,不回滚为+ -->

            <propkey="add*">PROPAGATION_REQUIRED,-Exception</prop>

            <propkey="modify*">PROPAGATION_REQUIRED,+MyException</prop>

            <propkey="del*">PROPAGATION_REQUIRED</prop>

            <propkey="*">READONLY</prop>

        </props>

    </property>

</bean>

<!-- 定义事务入口 -->

<beanid="proxyFactory"

    class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">

    <propertyname="interceptorNames">

        <list>

            <value>transactionInterceptor</value>

        </list>

    </property>

    <propertyname="beanNames">

        <list>

            <value>*Dao</value>

        </list>

    </property>

    <!--使用接口时-->

    <property name="proxyTargetClass">
<value>true</value>
    </property>

</bean>

第四种,利用注解。

<!-- 开户事务注解功能 -->

<tx:annotation-driventransaction-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事务的四种方式相关推荐

  1. Spring中配置DataSource数据源的几种选择

    Spring中配置DataSource数据源的几种选择 在Spring框架中有如下3种获得DataSource对象的方法: 从JNDI获得DataSource. 从第三方的连接池获得DataSourc ...

  2. java配置文件实现方式_java相关:详解Spring加载Properties配置文件的四种方式

    java相关:详解Spring加载Properties配置文件的四种方式 发布于 2020-4-29| 复制链接 摘记: 一.通过 context:property-placeholder 标签实现配 ...

  3. spring加载ApplicationContext.xml的四种方式

    spring加载ApplicationContext.xml的四种方式 spring 中加载xml配置文件的方式,好像有4种, xml是最常见的spring 应用系统配置源.Spring中的几种容器都 ...

  4. 用spring管理和实例化对象的四种方式

    用spring管理和实例化对象的四种方式 方式一:无参构造函数(最常用) 对象是spring创建,创建的对象还要交给spring容器管理 bean:豆子 id:在spring容器中Hello对象的名, ...

  5. Spring IOC (DI) 依赖注入的四种方式

    依赖注入的四种方式: set 注入 赋值,默认使用的是set() 方法,依赖注入底层是通过反射实现的 <bean id="student" class="cust. ...

  6. JavaScript中字符串连接/拼接的四种方式

    JavaScript中连接字符串的方式有4种,分别是使用加号运算符连接.使用${}配合反引号连接.使用concat()函数连接.使用join()函数连接. 1. 使用加号运算符 示例代码如下: let ...

  7. Java中数组转List的四种方式

    第一种方式(未必最佳):使用ArrayList.asList(strArray) 使用Arrays工具类Arrays.asList(strArray)方式,转换完成后,只能对List数组进行查改,不能 ...

  8. 【Spring】Spring的IOC依赖注入的四种方式

    作者简介:大家好,我是五度鱼,一个普通的Java领域博主,不停输出Java技术博客和干货. 座右铭:锲而不舍,金石可镂. 个人主页:五度鱼学Java的主页 文章目录 前言 1. set注入 2. 构造 ...

  9. Android开发中配置JDK环境的几种方式

    文章目录 一.前言 二.IDE设置 三.环境变量 四.gradle中配置 五.参考链接 一.前言 在Android开发中,配置JDK环境有以下几种方式来是Android项目正常编译 - changin ...

最新文章

  1. Windows下安装Memcached
  2. java记事本应用程序_Java教程:使用记事本编写运行Java程序
  3. python(numpy,pandas7)——pandas的数据选择
  4. c++ primer 5th 练习11.9自己编写的答案
  5. Netty学习笔记(六)Pipeline的传播机制
  6. KlayGE 4.0中Deferred Rendering的改进(四):GI的神话
  7. 2010 本年度认证目标:坐沙发的熊
  8. ebs 供应商地点信息_供应商,地址,业务实体,地点关联银行账户
  9. 【图像处理】灰度加权距离变换(GWDT)
  10. Macaca自动化测试Android和IOS应用
  11. 南京林业大学883数据结构本校资料
  12. 15.4.1 使用CREATE OR REPLACE VIEW语句修改视图结构
  13. 自有服务器网站备案,网站放自己服务器备案
  14. 前端的一些实用算法题
  15. vue实现调查问卷一页一题,上一题下一题形式
  16. 计算机文件与桌面文件同步,电脑文件同步到手机的技巧
  17. elementUI el-date-picker表单组件
  18. c语言字符串输入的陷阱
  19. 蓝桥杯单片机关闭蜂鸣器、继电器LED及数码管
  20. B类网络计算子网IP范围和掩码

热门文章

  1. 基础练习 高精度加法(蓝桥杯 java)
  2. 求解最长回文子串----Manacher 算法
  3. 南邮计算机专硕考研专业课,南京邮电大学(专业学位)计算机技术研究生考试科目和考研参考书目...
  4. android 获取phone实例,android – 可以通过sdk来实例化一个telephony.Phone对象吗?
  5. android 翻转切换view,Android ViewFlipper翻转视图使用详解
  6. pandas 合并所有列_Python学习:Pandas库
  7. cmd批量修改文件名 增加文字_Dynamo自动批量化修改文件名称
  8. typescript语法高亮插件_vscode常用插件
  9. jQuery中的ajax、jquery中ajax全局事件、load实现页面无刷新局部加载、ajax跨域请求jsonp、利用formData对象向服务端异步发送二进制数据,表单序列化(异步获取表单内容)
  10. Linux中cp和scp命令的使用方法和区别