(转载)spring配置hibernate 事务。

Spring和Hibernate整合后,通过Hibernate API进行数据库操作时发现每次都要opensession,close,beginTransaction,commit,这些都是重复的工作,我们可以把事务管理部分交给spring框架完成。

 

配置事务(xml方式)

使用spring管理事务后在dao中不再需要调用beginTransaction和commit,也不需要调用session.close(),使用API  sessionFactory.getCurrentSession()来替代sessionFactory.openSession()

 1 @Repository2 public class UserDaoImpl implements UserDao {3     @Autowired4     private SessionFactory sessionFactory;5     6     public User findUserById(int id) {7         Session session = sessionFactory.getCurrentSession();8         User user = (User)session.get(User.class, id);9         session.delete(user);
10         
11         return user;
12     }
13 }

采用getCurrentSession()创建的session会绑定到当前线程中,而采用openSession()创建的session则不会。

采用getCurrentSession()创建的session在commit或rollback时会自动关闭,而采用openSession()创建的session必须手动关闭。

使用getCurrentSession()需要在hibernate.cfg.xml文件中加入如下配置:

* 如果使用的是本地事务(jdbc事务)

<property name="hibernate.current_session_context_class">thread</property>

* 如果使用的是全局事务(jta事务)

<property name="hibernate.current_session_context_class">jta</property>

如果采用的时Hibernate4,使用getCurrentSession()必须配置事务,否则无法取到session

 

applicationContext.xml配置

 1 <?xml version="1.0" encoding="UTF-8"?>2 <beans3     xmlns="http://www.springframework.org/schema/beans"4     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"5     xmlns:p="http://www.springframework.org/schema/p"6     xmlns:context="http://www.springframework.org/schema/context"7     xmlns:aop="http://www.springframework.org/schema/aop"8     xmlns:tx="http://www.springframework.org/schema/tx"9     xmlns:jpa="http://www.springframework.org/schema/data/jpa"
10     xmlns:cache="http://www.springframework.org/schema/cache"
11     xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
12                         http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
13                         http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
14                         http://www.springframework.org/schema/data/jpa http://www.springframework.org/schema/data/jpa/spring-jpa.xsd
15                         http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd
16                         http://www.springframework.org/schema/cache http://www.springframework.org/schema/cache/spring-cache.xsd">
17     
18     <context:component-scan base-package="dao"/>
19     <context:component-scan base-package="service"/>
20     <context:component-scan base-package="test"/>
21     
22     <context:property-placeholder location="classpath:dbcp.properties"/>
23     <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
24         <property name="driverClassName" value="${driverClassName}" />
25         <property name="url" value="${url}" />
26         <property name="username" value="${mysqlusername}" />
27         <property name="password" value="${mysqlpassword}" />
28         <property name="maxActive" value="${maxActive}" />
29         <property name="maxIdle" value="${maxIdle}" />
30         <property name="minIdle" value="${minIdle}" />
31         <property name="maxWait" value="${maxWait}" />
32         <property name="initialSize" value="${initialSize}" />
33         <property name="logAbandoned" value="${logAbandoned}" />
34         <property name="removeAbandoned" value="${removeAbandoned}" />
35         <property name="removeAbandonedTimeout" value="${removeAbandonedTimeout}" />
36         <property name="timeBetweenEvictionRunsMillis" value="${timeBetweenEvictionRunsMillis}" />
37         <property name="numTestsPerEvictionRun" value="${numTestsPerEvictionRun}" />
38     </bean>
39     
40     <bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
41         <property name="dataSource" ref="dataSource" />
42         
43         <property name="hibernateProperties">
44             <props>
45                 <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
46                 <prop key="hibernate.show_sql">true</prop>
47                 <prop key="current_session_context_class">thread</prop>
48             </props>
49         </property>
50         
51         <property name="packagesToScan">
52             <list>
53                 <value>po</value>
54             </list>
55         </property>
56     </bean>
57 
58     
59     <!--hibernate4必须配置为开启事务 否则 getCurrentSession()获取不到--> 
60     <bean id="txManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
61         <property name="sessionFactory" ref="sessionFactory"></property>  
62     </bean>
63     
64     <tx:advice id="txAdvice" transaction-manager="txManager">
65         <tx:attributes>
66             <tx:method name="find*" propagation="REQUIRED" />
67             <tx:method name="*" read-only="true"/>
68         </tx:attributes>
69     </tx:advice>
70     
71     <aop:config proxy-target-class="true">
72         <!-- <aop:advisor advice-ref="txAdvice" pointcut="execution(* dao.*.*(..))"/> -->
73         <aop:pointcut expression="execution(* dao.*.*(..))" id="pointcut"/>
74         <aop:advisor advice-ref="txAdvice" pointcut-ref="pointcut"/>
75     </aop:config>
76 
77 </beans>

Spring中Propagation类的事务属性详解:

PROPAGATION_REQUIRED:支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择。 

PROPAGATION_SUPPORTS:支持当前事务,如果当前没有事务,就以非事务方式执行。 

PROPAGATION_MANDATORY:支持当前事务,如果当前没有事务,就抛出异常。 

PROPAGATION_REQUIRES_NEW:新建事务,如果当前存在事务,把当前事务挂起。

PROPAGATION_NOT_SUPPORTED:以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。 

PROPAGATION_NEVER:以非事务方式执行,如果当前存在事务,则抛出异常。 

PROPAGATION_NESTED:支持当前事务,如果当前事务存在,则执行一个嵌套事务,如果当前没有事务,就新建一个事务。

 

配置事务(声明方式)

需要在xml配制中设置<tx:annotation-driven transaction-manager="transactionManager"

 1 <?xml version="1.0" encoding="UTF-8"?>2 <beans3     xmlns="http://www.springframework.org/schema/beans"4     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"5     xmlns:p="http://www.springframework.org/schema/p"6     xmlns:context="http://www.springframework.org/schema/context"7     xmlns:aop="http://www.springframework.org/schema/aop"8     xmlns:tx="http://www.springframework.org/schema/tx"9     xmlns:jpa="http://www.springframework.org/schema/data/jpa"
10     xmlns:cache="http://www.springframework.org/schema/cache"
11     xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
12                         http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
13                         http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
14                         http://www.springframework.org/schema/data/jpa http://www.springframework.org/schema/data/jpa/spring-jpa.xsd
15                         http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd
16                         http://www.springframework.org/schema/cache http://www.springframework.org/schema/cache/spring-cache.xsd">
17     
18     <context:component-scan base-package="dao"/>
19     <context:component-scan base-package="service"/>
20     <context:component-scan base-package="test"/>
21     
22     <context:property-placeholder location="classpath:dbcp.properties"/>
23     <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
24         <property name="driverClassName" value="${driverClassName}" />
25         <property name="url" value="${url}" />
26         <property name="username" value="${mysqlusername}" />
27         <property name="password" value="${mysqlpassword}" />
28         <property name="maxActive" value="${maxActive}" />
29         <property name="maxIdle" value="${maxIdle}" />
30         <property name="minIdle" value="${minIdle}" />
31         <property name="maxWait" value="${maxWait}" />
32         <property name="initialSize" value="${initialSize}" />
33         <property name="logAbandoned" value="${logAbandoned}" />
34         <property name="removeAbandoned" value="${removeAbandoned}" />
35         <property name="removeAbandonedTimeout" value="${removeAbandonedTimeout}" />
36         <property name="timeBetweenEvictionRunsMillis" value="${timeBetweenEvictionRunsMillis}" />
37         <property name="numTestsPerEvictionRun" value="${numTestsPerEvictionRun}" />
38     </bean>
39     
40     <bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
41         <property name="dataSource" ref="dataSource" />
42         
43         <property name="hibernateProperties">
44             <props>
45                 <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
46                 <prop key="hibernate.show_sql">true</prop>
47                 <prop key="current_session_context_class">thread</prop>
48             </props>
49         </property>
50         
51         <property name="packagesToScan">
52             <list>
53                 <value>po</value>
54             </list>
55         </property>
56     </bean>
57 
58     
59     <bean id="txManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
60         <property name="sessionFactory" ref="sessionFactory"></property>  
61     </bean>
62     <tx:annotation-driven transaction-manager="txManager"/>
63     
64 </beans>

 

事物注解方式: @Transactional

当标于类前时,标示类中所有方法都进行事物处理,以下代码在service层进行事务处理(给Service层配置事务是比较好的方式,因为一个Service层方法操作可以关联到多个DAO的操作。在Service层执行这些Dao操作,多DAO操作有失败全部回滚,成功则全部提交。)

 1 @Service2 @Transactional3 public class UserServiceImpl implements UserService {4     @Autowired5     private UserDao userDao;6     7     public User getUserById(int id) {8         return userDao.findUserById(id);9     }
10 }

 

当类中某些方法不需要事物时:

 1 @Service2 @Transactional3 public class UserServiceImpl implements UserService {4     @Autowired5     private UserDao userDao;6     7     @Transactional(propagation = Propagation.NOT_SUPPORTED)8     public User getUserById(int id) {9         return userDao.findUserById(id);
10     }
11 }

 

@Transactional(propagation=Propagation.REQUIRED) 

如果有事务, 那么加入事务, 没有的话新建一个(默认情况下)
@Transactional(propagation=Propagation.NOT_SUPPORTED) 
容器不为这个方法开启事务
@Transactional(propagation=Propagation.REQUIRES_NEW) 
不管是否存在事务,都创建一个新的事务,原来的挂起,新的执行完毕,继续执行老的事务
@Transactional(propagation=Propagation.MANDATORY) 
必须在一个已有的事务中执行,否则抛出异常
@Transactional(propagation=Propagation.NEVER) 
必须在一个没有的事务中执行,否则抛出异常(与Propagation.MANDATORY相反)
@Transactional(propagation=Propagation.SUPPORTS) 
如果其他bean调用这个方法,在其他bean中声明事务,那就用事务.如果其他bean没有声明事务,那就不用事务.

事物超时设置:
@Transactional(timeout=30) //默认是30秒

事务隔离级别:
@Transactional(isolation = Isolation.READ_UNCOMMITTED)
读取未提交数据(会出现脏读, 不可重复读) 基本不使用
@Transactional(isolation = Isolation.READ_COMMITTED)
读取已提交数据(会出现不可重复读和幻读)
@Transactional(isolation = Isolation.REPEATABLE_READ)
可重复读(会出现幻读)
@Transactional(isolation = Isolation.SERIALIZABLE)
串行化

MYSQL: 默认为REPEATABLE_READ级别
SQLSERVER: 默认为READ_COMMITTED

脏读 : 一个事务读取到另一事务未提交的更新数据
不可重复读 : 在同一事务中, 多次读取同一数据返回的结果有所不同, 换句话说, 
后续读取可以读到另一事务已提交的更新数据. 相反, "可重复读"在同一事务中多次
读取数据时, 能够保证所读数据一样, 也就是后续读取不能读到另一事务已提交的更新数据
幻读 : 一个事务读到另一个事务已提交的insert数据

Spring整合hibernate4:事务管理,布布扣,bubuko.com

Spring整合hibernate4:事务管理

标签:des   style   blog   http   color   使用   

 

转载于:https://www.cnblogs.com/zhangkaikai/p/6856180.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/488341.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

oracle怎么把整形,【用bbed工具对Oracle进行微整形】

CUUG ORACLE大师网络免费课程——将个人姓名、电话发送到SIGNUPCUUG.COM即可报名CUUG新增“即时同步互动远程授课”&#xff0c;足不出户学ORACLE!详情见&#xff1a;HTTP://ORACLE.CUUG.COM/DBA1.HTML2013韩国小姐选美比赛佳丽样貌神似&#xff0c;难以分辨&#xff0c;无论是…

这篇长达165页的论文,用一个里程碑式的证明同时解决了量子物理学和理论数学的难题...

来源&#xff1a;机器之心计算机科学、数学、物理学&#xff0c;这三个学科各自的一些重大难题在近日发布的一篇标题简洁的论文《MIP*RE》中同时得到了解答。在该论文中&#xff0c;五位计算机科学家为可通过计算方式验证的知识确立了一个新的边界。基于此&#xff0c;他们又为…

mysql timestamp 不走索引_面试 - 要不简单聊一下你对MySQL索引的理解?

MySQL索引&#xff1f;这玩意儿还能简单聊&#xff1f;明显是在挖坑&#xff0c;幸好老夫早有准备&#xff0c;切听我一一道来。 一、索引是什么?索引是帮助MySQL高效获取数据的数据结构。二、索引能干什么?索引非常关键&#xff0c;尤其是当表中的数据量越来越大时&#xff…

redis 类型、方法

之前使用redis&#xff0c;现在对所有redis方法做一个总结&#xff1b; string类型 形式&#xff1a;key>value; 说明&#xff1a;最简单的类型&#xff1b;一个key对应一个value&#xff0c;value保存的类型是二进制安全的&#xff0c;string可以包含任何数据&#xff0c;比…

亚马逊首家“无人超市”系统存在bug?!开业当天,记者中途换装成功骗过摄像头...

来源&#xff1a;大数据文摘2018年&#xff0c;亚马逊推出了无人便利店Amazon Go&#xff0c;本着“无需排队、拿完就走”的理念在当时掀起了一番热潮。两年后&#xff0c;亚马逊“无人购物”升级&#xff0c;又在西雅图开设了“Plus版无人超市”Amazon Go Grocery&#xff08;…

oracle的一些常使用命令,Oracle 经常使用命令小结

项目自动化建构工具gradle 入门3——生一个exe的helloWorld前两次呢,我们能够用一个外部的jar 来实现输出helloWorld.但问题是我每次都要用java -jar 来执行,这样我们自己玩还可以,让用户玩就不好了.所以我们生成一个exe给他们吧.这次我们仍 ...LGLCalender &lpar;价格日历…

创新是低情商的人做的

评语&#xff1a;这时一个有趣的思考&#xff0c;不算是正式的研究&#xff0c;但可以算是有价值的科学火花&#xff0c;创新本身或许就是得罪人的事情&#xff0c;或者要推翻别人的观点&#xff0c;引起他人不高兴&#xff0c;或者他人有不同意见&#xff0c;要争论和辩解&…

【12.23】转行小白历险记-算法02

不会算法的小白不是好小白&#xff0c;可恶还有什么可以难倒我这个美女的&#xff0c;不做花瓶第二天&#xff01; 一、螺旋矩阵 59. 螺旋矩阵 II - 力扣&#xff08;LeetCode&#xff09; 1.核心思路&#xff1a;确定循环的路线&#xff0c;左闭右开循环&#xff0c;思路简…

MySQL 5.7.18 解压版安装

原文链接&#xff1a;https://my.oschina.net/u/3474266/blog/895696 我在安装免安装版的5.7.18的时候出现了问题&#xff0c;正好找到这个&#xff0c;十分感激 今天下载安装了MySQL Community Edition 5.7.18压缩版&#xff0c;过程中遇到了一些坑&#xff0c;特地写个博客记…

订单失效怎么做的_?糟了,刚发货的订单竟然被取消掉了?我该怎么办!

“叮叮&#xff01;您的Newegg国际商城有新订单啦&#xff0c;请及时查看&#xff01;”又来新订单了&#xff0c;赶紧打包发货&#xff01;可是三天后……“尊敬的商家您好&#xff0c;您的订单超过72 小时未发货&#xff0c;系统已经自动取消该订单”。什么&#xff1f;订单被…

oracle segment extent block,Oracle的基础问题segment extent block

l extent和segment的关系每个extent 的Oracle block 的数目是由extent的巨细/DB_BLOCK_SIZE 确定的,extent 巨细是由建立或修改segment 的SQL 语句中storage子句中的initial, next, pctincrease等参数确定。每个segment中的extent的数目是一个动态扩展的值, 最大值由建立或修改…

6G概念及愿景白皮书

来源&#xff1a;中国指挥与控制学会“本白皮书将从6G愿景、6G应用场景、6G网络性能指标、6G潜在关键技术、国际组织和各国6G研究进展等方面展开讨论&#xff0c;并提出加快推进我国6G研发的相关建议。”编写 | 赛迪智库无线电管理研究所 执笔 | 彭健 孙美玉 滕学强目录一、前言…

git编译安装与常见问题解决

1. 先去官网下载一个安装包 &#xff0c;假设目录/APP/ido2. cd /APP/ido3. tar -zxvf git-2.7.2.tar.gz4. 安装依赖yum -y install gcc openssl openssl-devel curl curl-devel unzip perl perl-devel expat expat-devel zlib zlib-devel asciidoc xmlto gettext-devel openss…

如何判断python固定文件存在吗_Python判断文件和文件夹是否存在的方法

这篇文章主要介绍了Python判断文件和文件夹是否存在的方法,本文还讲解了判断是否为文件或者目录的方法、os.path.lexist的作用、FTP中判断文件或目录是否存在等内容,需要的朋友可以参考下一、python判断文件和文件夹是否存在、创建文件夹代码如下:>>> import os>&g…

oracle rman和数据泵,使用RMAN或数据泵初始化OGG目标库

OGG 10引入新token变量LOGCSN&#xff0c;对应于oracle的scn&#xff0c;对此replicat可以指定开始csnStart replicat atcsn | aftercsn准备阶段同步前需确保源库的事务都已提交&#xff0c;应反复检查gv$transaction&#xff1b;对于无法终止的事务&#xff0c;从其起始时间执…

哺乳动物亚种在物种进化中至关重要

查尔斯达尔文的《物种起源》一书来源&#xff1a;科技日报 图片来源&#xff1a;物理学家组织网据物理学家组织网18日报道&#xff0c;查尔斯达尔文逝世约140年后&#xff0c;其进化论的一个理论终获证实&#xff01;英国剑桥大学科学家在18日出版的《英国皇家学会学报B卷》上撰…

window挂载到linux服务器上,在windows 7操作系统下设置挂载Linux服务器

在Windows 7操作系统下增加了很多有用的功能&#xff0c;只是默认没有开启而已&#xff0c;今天简述下一个Windows 7下的NFS功能&#xff0c;通过这个功能&#xff0c;可以让Windows 7共享Linux下面的磁盘分区或者目录数据&#xff0c;这个功能原理只能通过samba或者ftp来实现&…

Android属性动画完全解析(上),初识属性动画的基本用法

转载请注明出处&#xff1a;http://blog.csdn.net/guolin_blog/article/details/43536355 在手机上去实现一些动画效果算是件比较炫酷的事情&#xff0c;因此Android系统在一开始的时候就给我们提供了两种实现动画效果的方式&#xff0c;逐帧动画(frame-by-frame animation)和补…

两位概率论顶级专家获得2020阿贝尔奖

来源&#xff1a;哆嗒数学网弗斯滕伯格介绍当希勒尔弗斯滕伯格(Hillel Furstenberg) 发表其早期的一篇论文时&#xff0c;有传言说他并非一个人&#xff0c;而是一群数学家的化名。该论文涵盖的思想覆盖诸多领域&#xff0c;真的不可能是一个人的成果吗&#xff1f;虽然这件事可…

python长度单位转化_长度单位的换算教学反思

长度单位的换算教学反思陈双银使学生在认识了长度单位千米、米、分米、厘米、毫米的基础上&#xff0c;能够熟练地掌握长度单位千米、米、分米、厘米、毫米之间的进率&#xff0c;准确地进行单位之间的换算是长度单位这一单元的教学重点和难点。但是&#xff0c;对于这一知识点…