spring+hibernate+JTA分散式事務の例.


複数のHibernate Session Facotryにまたがる分散事務については、簡単にJtaTransation Managerと複数のLocarSession FactoryBenの定義を組み合わせるだけで事務戦略として機能します.あなたのDAOはbean属性を通してそれぞれのSession Factoryに引用されます.すべての底のJDBCデータソースが事務をサポートする容器であれば、JTA Transation Managerをビジネス戦略として使用すれば、複数のDAOと複数のsession factoresを横断して事務を分割することができ、何の特別な処理も必要としない.
<beans>

  <bean id="myDataSource1" class="org.springframework.jndi.JndiObjectFactoryBean">
    <property name="jndiName" value="java:comp/env/jdbc/myds1"/>
  </bean>

  <bean id="myDataSource2" class="org.springframework.jndi.JndiObjectFactoryBean">
    <property name="jndiName" value="java:comp/env/jdbc/myds2"/>
  </bean>

  <bean id="mySessionFactory1" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
    <property name="dataSource" ref="myDataSource1"/>
    <property name="mappingResources">
      <list>
        <value>product.hbm.xml</value>
      </list>
    </property>
    <property name="hibernateProperties">
      <value>
        hibernate.dialect=org.hibernate.dialect.MySQLDialect
        hibernate.show_sql=true
      </value>
    </property>
  </bean>

  <bean id="mySessionFactory2" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
    <property name="dataSource" ref="myDataSource2"/>
    <property name="mappingResources">
      <list>
        <value>inventory.hbm.xml</value>
      </list>
    </property>
    <property name="hibernateProperties">
      <value>
        hibernate.dialect=org.hibernate.dialect.OracleDialect
      </value>
    </property>
  </bean>

  <bean id="myTxManager" class="org.springframework.transaction.jta.JtaTransactionManager"/>

  <bean id="myProductDao" class="product.ProductDaoImpl">
    <property name="sessionFactory" ref="mySessionFactory1"/>
  </bean>

  <bean id="myInventoryDao" class="product.InventoryDaoImpl">
    <property name="sessionFactory" ref="mySessionFactory2"/>
  </bean>

  <!-- this shows the Spring 1.x style of declarative transaction configuration -->
  <!-- it is totally supported, 100% legal in Spring 2.x, but see also above for the sleeker, Spring 2.0 style -->
  <bean id="myProductService"
      class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
    <property name="transactionManager" ref="myTxManager"/>
    <property name="target">
      <bean class="product.ProductServiceImpl">
        <property name="productDao" ref="myProductDao"/>
        <property name="inventoryDao" ref="myInventoryDao"/>
      </bean>
    </property>
    <property name="transactionAttributes">
      <props>
        <prop key="increasePrice*">PROPAGATION_REQUIRED</prop>
        <prop key="someOtherBusinessMethod">PROPAGATION_REQUIRES_NEW</prop>
        <prop key="*">PROPAGATION_SUPPORTS,readOnly</prop>
      </props>
    </property>
  </bean>

</beans>
 <bean id="myDataSource1" class="org.springframework.jndi.JndiObjectFactoryBean">  
    <property name="jndiName" value="java:comp/env/jdbc/myds1"/>  
  </bean>  
  
  <bean id="myDataSource2" class="org.springframework.jndi.JndiObjectFactoryBean">  
    <property name="jndiName" value="java:comp/env/jdbc/myds2"/>  
  </bean>  
  
  <bean id="mySessionFactory1" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">  
    <property name="dataSource" ref="myDataSource1"/>  
    <property name="mappingResources">  
      <list>  
        <value>product.hbm.xml</value>  
      </list>  
    </property>  
    <property name="hibernateProperties">  
      <value>  
        hibernate.dialect=org.hibernate.dialect.MySQLDialect   
        hibernate.show_sql=true  
      </value>  
    </property>  
  </bean>  
  
  <bean id="mySessionFactory2" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">  
    <property name="dataSource" ref="myDataSource2"/>  
    <property name="mappingResources">  
      <list>  
        <value>inventory.hbm.xml</value>  
      </list>  
    </property>  
    <property name="hibernateProperties">  
      <value>  
        hibernate.dialect=org.hibernate.dialect.OracleDialect   
      </value>  
    </property>  
  </bean>  
  
  <bean id="myTxManager" class="org.springframework.transaction.jta.JtaTransactionManager"/>  
  
  <bean id="myProductDao" class="product.ProductDaoImpl">  
    <property name="sessionFactory" ref="mySessionFactory1"/>  
  </bean>  
  
  <bean id="myInventoryDao" class="product.InventoryDaoImpl">  
    <property name="sessionFactory" ref="mySessionFactory2"/>  
  </bean>  
  
   <bean id="myProductService" class="product.service.myProductServiceImpl">  
    <property name="productDao" ref="myProductDao"/>  
    <property name="inventoryDao" ref="myInventoryDao"/>  
  </bean>  

  <aop:config>
		<aop:pointcut id="managerTx"
			expression="execution(* product.service..*Service.*(..))" />
		<aop:advisor advice-ref="txAdvice" pointcut-ref="managerTx" />
	</aop:config>

	<tx:advice id="txAdvice" transaction-manager="myTxManager">
		<tx:attributes>
			<tx:method name="get*" read-only="true" />
			<tx:method name="find*" read-only="true" />
			<tx:method name="save*" propagation="REQUIRED" />
			<tx:method name="remove*" propagation="REQUIRED" />
			<tx:method name="*" />
		</tx:attributes>
	</tx:advice>
すでにあります
0人がメッセージを発表し、猛撃->>
ここ<->討論に参加します.
ITeyおすすめ
  • —ソフトウェア人材は言語を免除して低い保証で米国に行きます.