在Spring中集成Hibernate事务

来源:百度文库 编辑:神马文学网 时间:2024/04/20 07:13:55
 
作者:佚名    文章来源:不详    点击数: 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>
_xyz