Spring对Hibernate的事务支持

 spring提供了对hibernate等pojo对象的事务管理的支持。这是一个spring的一个意义重大的特性。

   spring提供两种方式对hibernate提供事务管理方式,分别为编程式事务管理和声明式事务管理。

   spring事务策略,也就是spring事务管理的实现方式.它有一个统一的抽象是由实现下面这个接口完成的.org.springframework.transaction.PlatformTransactionManager.像我们常见到的HibernateTransactionManager也是实现的这个接口。

    不管是声明式的还是编程式的事务管理都需要此抽象来完成.


    一、编程式事务
    编程式事务常用getCurrentSession和openSession来完成。

代码片段

[java]  view plain copy
  1. public void addUser(User user) {   
  2.        Sessionsession=null;  
  3.        try{  
  4.             session=HibernateUtils.getSessionFactory().getCurrentSession();  
  5.             //或者session=HibernateUtils.getSessionFactory().openSession();  
  6.             session.beginTransaction();            
  7.             session.save(user);         
  8.             Log log=new Log();  
  9.             log.setType("caozuorizhi");  
  10.             log.setTime(new Date());  
  11.             log.setDetail("RIZHI");         
  12.             LogManager logManager=newLogMangerImpl();  
  13.             logManager.addLog(log);         
  14.             session.getTransaction().commit();              
  15.        }catch(Exception e){  
  16.            e.printStackTrace();  
  17.            session.getTransaction().rollback();  
  18.         
  19.        }  
  20.    }  


    那么这两种方法openSession和getCurrentSession有什么区别呢?

   (1)、openSession必须关闭,currentSession在事务结束后自动关闭

          openSession没有和当前线程绑定,currentSession和当前线程绑定,即在一个线程中是同一个Session。而OpenSession每次用到的都不是同一个,所以用完后需要关闭。

  

   (2)、如果使用currentSession需要在hibernate.cfg.xml文件中进行配置:

    * 如果是本地事务(jdbc事务)

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

    * 如果是全局事务(jta事务)

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


    二、声明式事务管理。

     来看spring对hibernate的声明式事务支持。。

     Spring对声明式事务的支持其实就是spring的AOP框架的一个实现。AOP显然很适合来实现声明式事务管理,因为事务是系统级的服务,他跟主功能逻辑没有关系,应该是在应用程序主功能的上面一层。这样可以把spring的事务认作是包装了一个方法的切面。

     声明式事务主要在配置文件中进行配置。

[html]  view plain copy
  1. <!-- 配置SessionFactory  -->  
  2.   <bean id="sessionFactory"class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">  
  3.      <property name="configLocation">  
  4.           <value>classpath:hibernate.cfg.xml</value>  
  5.      </property>  
  6.    
  7.   </bean>  
  8.    
  9.  <!-- 配置事务管理器 -->  
  10.  <bean id="transactionManager"class="org.springframework.orm.hibernate3.HibernateTransactionManager">  
  11.      <property name="sessionFactory">  
  12.             <ref bean="sessionFactory"/>  
  13.      </property>  
  14. </bean>  
  15.    
  16. <!-- 说明哪些方法使用事务 -->  
  17. <aop:config>  
  18.      <aop:pointcut id="allManagerMethod"expression="execution(* com.wh.usermgr.manager.*.*(..))"/>  
  19.      <aop:advisor pointcut-ref="allManagerMethod"advice-ref="txAdvice"/>  
  20.       
  21. </aop:config>  
  22. <!--事务的传播特性配置  -->  
  23. <tx:advice  id="txAdvice"transaction-manager="transactionManager">  
  24.   <tx:attributes>  
  25.           <tx:method name="add*"propagation="REQUIRED"/>  
  26.           <tx:method name="del*"propagation="REQUIRED"/>  
  27.           <tx:method name="modify*"propagation="REQUIRED"/>  
  28.           <tx:method name="*"propagation="REQUIRED" read-only="true"/>  
  29.   </tx:attributes>  
  30. </tx:advice>  


     大多数Spring用户选择声明式事务管理,这是最少影响应用代码的选择,因而这是和非侵入性的轻量级容器的观念是一致的。

   

    最后,总结一下Spring事务的优点:


    为不同的事务API提供一致的编程模型,如JTA、JDBC、Hibernate、iBATIS数据库层JDO
    提供比大多数事务API更简单的、易于使用的编程式事务管理API
    整合Spring数据访问抽象
    支持Spring声明式事务管理

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值