Я думаю, у вас есть 2 варианта
Если ваши сценарии использования никогда не требуют обновления обеих баз данных в рамках одной транзакции, то вы можете использовать два JpaTransactionManager, но я не уверен, что вы сможете использовать подход @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, предоставляемом сервером приложений. Однако вы также можете использовать автономный менеджер транзакций JTA (но я сам еще не пробовал)
Что касается настройки поставщика сохраняемости Jpa, я не настолько знаком. Какой провайдер JPA вы используете?
Приведенный выше код основан на нашем подходе, в котором мы использовали нативный Hibernate, а не реализацию JPA Hibernate. В этом случае нам удалось избавиться от двух bean-компонентов HibernateTransactionManager и просто убедиться, что обе SessionFactories были внедрены с одной и той же JTA TM, а затем использовать элемент tx: annotation-driven.
Надеюсь, это поможет