hibernate 和 spring 整合的事物管理

由于以前没有深入接触到spring,对spring的事物支持不了解,以前自己参与的一些系统中,出现过在业务逻辑层一个小步出错,但是前面的步骤已经持久化,不能回滚。只能通过定时器读取日志,发现出错就删除这条记录。在最近较为深入的了解spring,发现spring对事物的支持能解决这一问题。

一、如果多个数据源(使用spring的jta事物管理策略)

org.springframework.transaction.jta.JtaTransactionManager代理了J2EE容器的JTA子系统,提供了跨越多个资源的分布式事物管理能力,这种事物管理策略必须运行在J2EE应用服务器环境中,spring只不过是提供一种集成到J2EE容器的事务管理器,并不执行具体的事物管理。

对于跨越多个HibernateSessionFactory事物资源的分布式系统,只需简单吧JtaTransactionManager同多个LocalSessionFactoryBean定义结合起来作为一个事务策略,如果所有JDBCdataSource都支持事务的容器,那么只要一个业务对象使用了JTA策略,其他的业务对象会自动参与当前的JTA事务

xml配置

  
<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
      <property name="jndiName">
         <value>java:cn/com/test/jdbc/dataSource1</value>
      </property>
    </bean>
     <bean id="dataSource2"class="org.springframework.jndi.JndiObjectFactoryBean">
      <property name="jndiName">
         <value>java:cn/com/test/jdbc/dataSource2</value>
      </property>
    </bean>

      <bean id="SessionFactory1"class="org.springframework.orm.hibernate.LocalSessionFactoryBean">
      <property name="dataSource">
         <value>dataSource</value>
      </property>
      ...//省略
    </bean>
   
     <bean id="SessionFactory2"class="org.springframework.orm.hibernate.LocalSessionFactoryBean">
      <property name="dataSource">
         <value>dataSource2</value>
      </property>
      ...//省略
    </bean>
    
.....//省略配置dao的bean
    
   <bean id="myTransactionManager" class="org.springframework.transaction.jta.JtaTransactionManager"/>
   
   <bean id="myService" class="test.testService.impl.TestServiceImpl">
      <property name="transactionManager">
         <value>myTransactionManager</value>
      </property>
      ..//注入Dao
   </bean>

二、一个数据源

当只有一个数据源时(大多数情况下,只有一个数据源),可以使用org.springframework.orm.hibernate3.HibernateTransactionManager.这种事务不依赖J2EE容器,仅仅需要org.hibernate.SessionFactory对象的一个实例。

xml配置文件

    
<bean id="transactionManager"class="org.springframework.orm.hibernate3.HibernateTransactonManager">
      <property name="sessionFactory">
         <value>sessionFactory</value>
      </property>
    </bean>

以前我们的事务都是使用DB的事务来处理的,但是如果我们打开一个事务,并把一系列过程处理完再关闭事务,那么我们Dao层的代码会耦合业务层的代码,再我了解到jta和spring之前,对这样的问题,解决不了,现在再了解到这样的技术后,以后都能解决。

我们在工作中会遇到很多很多的问题,可能受限于我们当时的知识储备和经验不能解决,但是在整个java社区中可能其他人也遇到这样的问题,他们已经做出了成熟的解决方案。我们不能停下学习的脚步。

今日记一事,明日明一理,积久而成学。

相关推荐