分享

在Spring中集成Hibernate事务

 bluecrystal 2006-06-08
在Spring中集成Hibernate事务

 

作者:佚名    文章来源:不详    点击数: 5    更新时间:2006-4-29    

1 2 3 4 下一页


  本文试图解释如何使用Spring来集成组件(包括组件的事务关系)。在J2EE应用程序中,连接到单个存储数据没有什么困难。但是一旦要求集成企业级组件的时候,情况就复杂了。一个组件一般会受到一个或多个存储数据的支持,因此当我们提到集成一个或多个组件的时候,我们就认为需要跨越多个组件、维护多个数据存储中的原子操作。J2EE服务器为这些组件提供了一个容器,这个容器可以管理这些事务性原子操作和跨组件的隔离。如果我们没有使用J2EE服务器,Spring可以帮助我们。Spring在集成组件服务和它们相关的事务关系的时候,是基于控制倒置(Inversion of Control)的。

  集成(Assembling)组件事务

  假设在我们的企业组件库中,已经拥有了一个审计(audit)组件,客户端可以调用它的服务方法。后来,当我们希望建立一个订单处理系统的时候,我们发现了一个设计需求:OrderListManager组件服务也需要审计组件服务。OrderListManager建立和管理订单,因此所有的OrderListManager服务都有自己的事务属性。当我们在OrderListManager服务内部调用审计组件的时候,会把OrderListManager服务的事务关系(context)传递到审计服务中。也许在未来某个时候,某个新的业务服务组件也需要审计组件服务,但是该审计服务将会在一个完全不同的事务关系中被调用。其实际结果是,虽然审计组件的功能仍然没有变化,但是它可以与其它的业务服务功能组合使用,使用混合和匹配(mix-and-match)的事务属性来提供不同的运行时(run time)事务行为。

  图1显示了两个相互独立的调用关系流。在流1中,如果客户端拥有TX关系,OrderListManager要么参与它,要么启动一个新的TX,这依赖于Client是否在某个TX中,以及为OrderListManager方法提供了什么样的TX属性。OrderListManager服务接下来调用AuditManager方法的时候,这样的解释也是正确的。


图1:集成组件事务

  EJB架构通过允许组件集成器宣告式地(declaratively)提供正确的事务属性来实现这种灵活性。我们没有研究宣告式事务管理的替代物(称为编程式事务控制),因为它涉及到改变代码来影响不同的运行时事务行为。几乎所有的J2EE应用程序服务器都按照X/Open XA规范提供了分布式的事务管理器来适应两步提交(Two-Phase Commit)协议。现在的问题是,在EJB服务器之外,我们能利用相同的功能吗?Spring就是一个替代解决方案。让我们来看看Spring是如何帮助我们解决事务集成问题的。

  使用Spring进行事务管理

  我们将看到一个轻量级的事务架构,它能够管理组件级的事务集成。Spring就是一个解决方案,它的优势在于它没有像JNDI 数据源那样嵌入到J2EE容器服务中。还有一点值得注意,如果我们希望把这个轻量级的事务架构插入到已有的J2EE容器中,也没有任何困难。看起来它在两者之间的平衡性方面做得很好。

  另一方面,Spring 轻量级事务架构还使用了面向方面编程(AOP)框架。Spring AOP框架组件使用了激活了AOP的Spring bean工厂。通过在组件服务层(在一个Spring特定的配置文件applicationContext.XML中)指定事务特性,就把各种事务划分开来了。

<beans>

<!-其它一些代码... -->

<bean id="orderListManager" class="org.springFramework.transaction
.interceptor.TransactionProxyFactoryBean">
 <property name="transactionManager">
  <ref local="transactionManager1"/>
 </property>
 <property name="target">
  <ref local="orderListManagerTarget"/>
 </property>
 <property name="transactionAttributes">
  <props>
   <prop key="getAllOrderList">
    PROPAGATION_REQUIRED
   </prop>
  <prop key="getOrderList">
   PROPAGATION_REQUIRED
  </prop>
  <prop key="createOrderList">
   PROPAGATION_REQUIRED
  </prop>
  <prop key="addLineItem">
   PROPAGATION_REQUIRED,
   -com.example.exception.FacadeException
  </prop>
  <prop key="getAllLineItems">
   PROPAGATION_REQUIRED,readOnly
  </prop>
  <prop key="queryNumberOfLineItems">
   PROPAGATION_REQUIRED,readOnly
  </prop>
 </props>
</property>
</bean>

</beans>

  一旦我们在服务层指定了事务属性,它们(即事务属性)就可以被org.springframework.transaction.PlatformTransactionManager接口的具体实现所截取和解释。该接口如下所示:

public interface PlatformTransactionManager{
 TransactionStatus getTransaction(TransactionDefinition definition);
 void commit(TransactionStatus status);
 void rollback(TransactionStatus status);
}

  Hibernate事务管理器

  由于我们已经决定把Hibernate作为ORM工具,我们必须编写一个Hibernate特定的事务管理器实现,我们下一步就做这个工作。

<beans>

<!-- other code goes here... -->

<bean id="transactionManager1" class="org.springframework.orm.hibernate. HibernateTransactionManager">
<property name="sessionFactory">
<ref local="sessionFactory1"/>
</property>
</bean>

</beans>

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多