3聲明式管理Hibernate分布式事務
通過Spring,還可以很方便地切換至另一種事務管理策略。比如需要提供分布式事務管理策略時,只要替換一下配置即可,如代碼10.29所示。
代碼10.29 appContext-jta.xml
<beans>
<bean id="transactionManager"
class="org.springframework.transaction.jta.JtaTransactionManager">
??? <property name="sessionFactory" >
????? <ref bean="sessionFactory" />
??? </property>
</bean>
<bean id="myDataSource1"
class="org.springframework.jndi.JndiObjectFactoryBean">
????? <property name="jndiName">
????????? <value>java:comp/env/jdbc/myds1</value>
????? </property>
</bean>
<bean id="myDataSource2"
class="org.springframework.jndi.JndiObjectFactoryBean">
????? <property name="jndiName">
????????? <value>java:comp/env/jdbc/myds2</value>
????? </property>
</bean>
<bean id="sessionFactory1"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
??? <property name="dataSource" ref="myDataSource1"/>
??? <property name="configLocations">
????? <value>hibernate.cfg1.xml</value>
??? </property>
</bean>
<bean id="sessionFactory2"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
??? <property name="dataSource" ref="myDataSource2"/>
??? <property name="configLocations">
????? <value>hibernate.cfg2.xml</value>
??? </property>
</bean>
<bean id="dao1"
class="daopackage1.DaoImpl">
??? <property name="sessionFactory" ref="sessionFactory"/>
</bean>
<bean id="dao2"
class="daopackage2.DaoImp2">
??? <property name="sessionFactory" ref="sessionFactory"/>
</bean>
</beans>
<bean id="business" class="businesspackage.BusinessFacadeImpl">
??? <property name="dao1">
????? <ref bean="dao1"/>
??? </property>
??? <property name="dao2">
????? <ref bean="dao2"/>
??? </property>
</bean>
<bean id="businessProxy"
class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
??? <property name="transactionManager">
????? <ref bean="transactionManager" />
??? </property>
??? <property name="target">
????? <ref bean="business" />
??? </property>
??? <property name="transactionAttributes">
????? <props>
??????? <prop key="business*">PROPAGATION_REQUIRED</prop>
??????? <prop key="someOtherBusiness*">PROPAGATION_MANDATORY</prop>
????? </props>
??? </property>
</bean>
</beans>
可以看到,對于橫跨多個Hibernate SessionFacotry的分布式事務,只需簡單地將JtaTransactionManager和LocalSessionFactoryBean的定義結合起來就可以了,其中每個DAO通過bean屬性得到各自的SessionFactory引用。
說明:如果所有底層數據源都是支持事務的容器,那么只需要對一個業務對象應用JtaTransactionManager策略,該對象就可以橫跨多個DAO和多個Session Factory來劃分事務了。使用Spring的最大好處就是,可通過配置來聲明式地管理事務,無需對應用代碼作任何改動。
posted on 2009-07-27 01:52
jadmin 閱讀(104)
評論(0) 編輯 收藏