zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    Linux下Samba的配置
    NYoj-街区最短路径问题
    Merge into的使用具体解释-你Merge了没有
    c++11 stl atomic_flag 样例
    7个最好的免费杀毒软件下载
    关于PCA算法的一点学习总结
    linux查看硬件信息
    js php xmlrequest 上传图片
    BZOJ1827 [Usaco2010 Mar]gather 奶牛大集会
    只有小于65535端口编程可以用,查看哪些端口被打开netstat -anp,nc命令,nmap命令
  • 原文地址:https://www.cnblogs.com/xuzekun/p/7399523.html
Copyright © 2011-2022 走看看