Я предполагаю, что у вас есть 2 варианта
Если ваши прецеденты никогда не требуют обновлений для обеих баз данных в рамках одной и той же транзакции, тогда вы можете использовать два JpaTransactionManagers, но я не уверен, что вы сможете использовать подход @Transactional ? В этом случае вам нужно будет Откат на старом механизме с помощью простого TransactionProxyFactoryBean для определения границ транзакций, например:
<bean id="firstRealService" class="com.acme.FirstServiceImpl"/>
<bean id="firstService"
class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<property name="transactionManager" ref="firstJpaTm"/>
<property name="target" ref="firstRealService"/>
<property name="transactionAttributes">
<props>
<prop key="insert*">PROPAGATION_REQUIRED</prop>
<prop key="update*">PROPAGATION_REQUIRED</prop>
<prop key="*">PROPAGATION_REQUIRED,readOnly</prop>
</props>
</property>
</bean>
<!-- similar for your second service -->
Если вы требуете сделок, охватывающими обе базы данных, то вам необходимо будет использовать JTA менеджер транзакций. В API указывается:
Этот менеджер транзакций подходит для приложений, которые используют один JPA EntityManagerFactory для доступа к транзакционным данным. JTA (обычно через JtaTransactionManager) необходим для доступа к нескольким транзакционным ресурсам в рамках одной и той же транзакции. Обратите внимание, что вам необходимо настроить поставщика JPA соответственно, чтобы он участвовал в транзакциях JTA.
Это означает, что вам необходимо предоставить менеджера транзакций JTA. В нашем приложении мы используем конфигурации, подобные следующему:
<tx:annotation-driven transaction-manager="txManager"/>
<bean id="txManager"
class="org.springframework.transaction.jta.JtaTransactionManager">
<property name="transactionManagerName" value="appserver/jndi/path" />
</bean>
При развертывании внутри сервера приложений, то весной JtaTransactionManager должен сделать поиск в реальном XA-совместимого менеджер транзакций JTA, предоставленный AppServer. Тем не менее, вы также можете использовать автономный менеджер транзакций JTA (но я еще не пробовал это сам)
Что касается настройки поставщика непрерывности Jpa, я не так привык. Какой провайдер постоянства JPA вы используете?
Приведенный выше код основан на нашем подходе, в котором мы использовали родной Hibernate, а не JPA-реализацию Hibernate. В этом случае нам удалось избавиться от двух бобин HibernateTransactionManager и просто убедиться, что обе SessionFactories были введены с тем же JTA TM, а затем используют элемент, управляемый аннотациями tx:.
Надеется, что это помогает
может предоставить пример кода или POC jtaTransaction с несколькими базами данных? – dhroove 2013-05-21 09:08:41