8.Spring整合Hibernate_2_声明式的事务管理(Annotation的方式)

声明式的事务管理(AOP的主要用途之一) (Annotation的方式)

  1.加入annotation.xsd

  2.加入txManager bean

  3.<tx:annotation-driven

1     <tx:annotation-driven transaction-manager="txManager"/>
2     <bean id="txManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
3         <property name="sessionFactory" ref="sessionFactory"/>
4       </bean>

  4.在需要的事务的方法上加  : @Transactional

  @Transactional

    1.被注解的方法只有在抛出 运行时异常才会触发rollback,非运行时异常不会rollback

    2.不管什么异常,只要你catch了,spring就会放弃管理

    3.事务的传播特性  propagation_required

      例如:@Transactional(propagation = Propagation.REQUIRED) 等同于(@Transactional)

      作用:一个方法声明了@Transactional事务后,其内再调用方法不需要再声明@Transactional

    4.read_only     

      例如:@Transactional(propagation = Propagation.REQUIRED,readOnly=true)

      当方法声明为 readOnly  = true 时,该方法及其调用的方法内都不执行 insert  update等

 1 //使用 @Transactional 注解 ,声明 需要进行事务管理的方法
 2     //事务管理,同样体现了 AOP ,即在方法的执行前后,加上事务开启 和 事务关闭语句,如果发现了 运行时异常,就会rollback
 3     //为什么在这里事务管理要放到 Service层,不放到DAO层:1.因为该add方法牵扯到了多个DAO,里面有setMsg方法 和 save方法,要保证这两个方法 ‘荣辱与共’
 4     //所以 service 的 add 方法需要 进行事务管理,
 5     //如果 add 方法中,只用到了一个DAO,那么只需要在 该 DAO 需要 进行事务管理的方法上进行 管理即可
 6
 7     //事务的传播特性:
 8     //@Transactional(propagation=Propagation.REQUIRED) == (@Transactional)
 9     //一个方法声明了 @Transactional 事务后,其内再调用的方法不需要再声明 @Transactional
10     //别人调 add 方法,如果这个add方法之前 ,如果说已经有了一个 transaction,就用原来那个,如果没有(在UserService中没有事务),就创建一个新的(即需要(required)的时候才创建)
11
12     //read_only
13     //当方法声明 readOnly=true时,就产生一个 只读 的 connection ,当方法内部只有读取的业务时,可以使用,提高性能
14
15     @Transactional(propagation=Propagation.REQUIRED,readOnly=true)
16     public void add(User user) {
17         Log log = new Log();
18         log.setMsg("logmsg");
19         logDAO.saveMsg(log);
20         userDAO.save(user);
21     }

  5.需要注意,使用事务后,Hibernate 获得 session时要使用getCurrentSession,不能使用openSession

  为什么?:使用事务后,不能使用openSession,否则可能会创建一个新的session,无法保证和后面的方法是在同一个事务中

  

 1 @Component("userDAO")
 2 public class UserDAOImpl implements UserDAO{
 3     private SessionFactory sessionFactory;
 4
 5     public SessionFactory getSessionFactory() {
 6         return sessionFactory;
 7     }
 8
 9     //在DAO中 注入 setSessionFactory
10     @Resource
11     public void setSessionFactory(SessionFactory sessionFactory) {
12         this.sessionFactory = sessionFactory;
13     }
14
15     @Override
16     public void save(User user) {
17     //注:使用事务后,不能使用 openSession,否则会 创建一个 新的session,无法保证和后面的方法是在同一事务中
18
19         Session session = sessionFactory.getCurrentSession();
20         session.save(user);
21         System.out.println(sessionFactory.getClass());
22         System.out.println("a user saved");
23
24         //1.运行期异常,非运行期异常不会触发rollback
25         throw new RuntimeException("1");
26     }
27
28
29 }
时间: 2024-11-14 08:00:38

8.Spring整合Hibernate_2_声明式的事务管理(Annotation的方式)的相关文章

9.Spring整合Hibernate_2_声明式的事务管理(Xml的方式)

使用xml的方式进行声明式的事务管理 推荐使用xml的方式,因为可以同时为多个方法进行声明 1 <!-- 开启Spring中的事务管理(声明式的事务管理) xml--> 2 3 <!-- 不管是通过 xml 还是注解的方式 来进行声明式的事务管理,都需要 加载TransactionManager或 DataSouce 4 因为 事务是与是与数据库相关的,需要数据库一些配置信息 5 --> 6 <bean id="txManager" class="

Spring基于声明式的事务管理

事务管理 Spring提供了编码式和声明式事务管理的支持. 编码式事务允许用户在代码中精确定义事务的边界,而声明式事务(基于AOP)用助于用户将操作与事务解耦. 选择编码式还是声明式在很大程度上是在细粒度控制和易用性之间权衡. Spring并不直接管理事务,而是提供多种事务管理器,将它们事务管理职责委托给JTA或其他持久化机制所提供的平台相关的事务实现.每个事务管理器都会充当某一特定平台的事务实现的门面,这使得用户在Spring中使用事务时,不用关注事务的实际实现是什么. JDBC事务 <bea

Spring整合JMS(四)——事务管理

原文链接:http://haohaoxuexi.iteye.com/blog/1983532 Spring提供了一个JmsTransactionManager用于对JMS ConnectionFactory做事务管理.这将允许JMS应用利用Spring的事务管理特性.JmsTransactionManager在执行本地资源事务管理时将从指定的ConnectionFactory绑定一个ConnectionFactory/Session这样的配对到线程中.JmsTemplate会自动检测这样的事务资

mybatis、Spring整合(eclipse)以及事务管理

1.项目目录 2.jar包 dbcp:连接池 pool:连接池 logging:日志 log4j:日志 mybatis-spring:用于SqlSession等相关操作 spring相关包 mybatis 3.web.xml配置 可以删除本配置文件,本次测试用的是JUnit,不涉及网络访问,所有该配置文件并不需要 <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http

Spring整合hibernate:3、使用XML进行声明式的事务管理

配置applicationContext.xml文件 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 <?xml version="1.0" encoding=&qu

Spring事务管理的实现方式:编程式事务与声明式事务

本文转载于本人另一博客[http://blog.csdn.net/liaohaojian/article/details/70139151] 1.上篇文章讲解了Spring事务的传播级别与隔离级别,以及分布式事务的简单配置,点击回看上篇文章 2.编程式事务:编码方式实现事务管理(代码演示为JDBC事务管理) Spring实现编程式事务,依赖于2大类,分别是上篇文章提到的PlatformTransactionManager,与模版类TransactionTemplate(推荐使用).下面分别详细介

(转)spring事务管理几种方式

转自:http://blog.csdn.net/jeamking/article/details/43982435 前段时间对Spring的事务配置做了比较深入的研究,在此之间对Spring的事务配置虽说也配置过,但是一直没有一个清楚的认识.通过这次的学习发觉Spring的事务配置只要把思路理清,还是比较好掌握的. 总结如下: Spring配置文件中关于事务配置总是由三个组成部分,分别是DataSource.TransactionManager和代理机制这三部分,无论哪种配置方式,一般变化的只是

[转] spring事务管理几种方式

前段时间对Spring的事务配置做了比较深入的研究,在此之间对Spring的事务配置虽说也配置过,但是一直没有一个清楚的认识.通过这次的学习发觉Spring的事务配置只要把思路理清,还是比较好掌握的. 总结如下: Spring配置文件中关于事务配置总是由三个组成部分,分别是DataSource.TransactionManager和代理机制这三部分,无论哪种配置方式,一般变化的只是代理机制这部分. DataSource.TransactionManager这两部分只是会根据数据访问方式有所变化,

spring 事务管理的配置方式

Spring是SSH中的管理员,负责管理其它框架,协调各个部分的工作.今天一起学习一下Spring的事务管理.Spring配置文件中关于事务配置总是由三个组成部分,分别是DataSource.TransactionManager和代理机制这三部分,无论哪种配置方式,一般变化的只是代理机制这部分. DataSource.TransactionManager这两部分只是会根据数据访问方式有所变化,比如使用Hibernate进行数据访问时,DataSource实际为SessionFactory,Tra