У меня есть 2 базы данных (MySql и HSQLDB). Я настроил 2 источника данных и 2 боба EntityManagerFactory. Я могу также настроить 2 соответствующих боба JpaTransactionManager.
Но я не знаю, как определить, кто из них должен использоваться для управления транзакциями для конкретного класса обслуживания. Я хочу использовать @Transactional
аннотация с этой целью, но я на самом деле могу определить только один из txManagers:
<tx:annotation-driven transaction-manager="manager"/>
Каков выход из этой ситуации?
Джавадок для JpaTransactionManager имеет некоторые советы по этому поводу:
Этот менеджер транзакций - подходящий для приложений, использующих единый JPA EntityManagerFactory для доступ к транзакционным данным. JTA (обычно через JtaTransactionManager) необходим для доступа к нескольким транзакциям ресурсы в рамках одной и той же сделки. Обратите внимание, что вам необходимо настроить ваш JPA-провайдер соответственно для того, чтобы сделать его участником JTA транзакции.
Другими словами, если вы находитесь с несколькими менеджерами сущностей, с соответствующими tx менеджерами, то вам следует подумать об использовании вместо них одного JtaTransactionManager
. Менеджеры сущностей должны иметь возможность участвовать в JTA транзакциях, и это даст вам полную транзакцию между обоими менеджерами сущностей, не беспокоясь о том, в каком менеджере сущностей вы находитесь в любой момент времени.
Конечно, JtaTransactionManager
требует полного JTA-сервера приложений, а не ванильного сервлет-движка, как Tomcat.
Объявите ваш
без атрибута transaction-manager, объявите квалификаторы для менеджеров транзакций, как это:
<bean id="jpaTransactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory" ref="entityManagerFactory" />
<qualifier value="txManager1"/>
</bean>
Используйте этот классификатор в @Transactional в качестве значения для выбора одного из менеджеров транзакций:
@Transactional("txManager1")
или, с большим количеством свойств:
@Transactional(value = "txManager1", readOnly = true)