Прежде всего, благодаря user332768 и bert. Я попытался использовать AbstractRoutingDataSource, как упомянуто в ссылке, предоставленной bert, но заблудился, пытаясь подключить мой слой jpa (eclipselink). Я вернулся к своему старому подходу с некоторыми изменениями. Решение выглядит чище (ИМХО) и работает нормально. (переключение базы данных во время выполнения, а также запись в несколько баз данных в одной транзакции)
public class MyEntityManagerFactoryImpl implements MyEntityManagerFactory, ApplicationContextAware {
private HashMap<String, EntityManagerFactory> emFactoryMap;
public EntityManager getEntityManager(String releaseId) {
return SharedEntityManagerCreator.createSharedEntityManager(emFactoryMap.get(releaseName));
}
@Override
public void setApplicationContext(ApplicationContext applicationContext)
throws BeansException {
Map<String, LocalContainerEntityManagerFactoryBean> emMap = applicationContext.getBeansOfType(LocalContainerEntityManagerFactoryBean.class);
Set<String> keys = emMap.keySet();
EntityManagerFactory entityManagerFactory = null;
String releaseId = null;
emFactoryMap = new HashMap<String, EntityManagerFactory>();
for (String key:keys) {
releaseId = key.split("_")[1];
entityManagerFactory = emMap.get(key).getObject();
emFactoryMap.put(releaseId, entityManagerFactory);
}
}
}
Теперь я внедряю свои DAO с экземпляром (singleton) MyEntityManagerFactoryImpl. Затем дао просто вызовет createSharedEntityManager с необходимым выпуском и получит правильный EntityManager для этой базы данных. (Обратите внимание, что сейчас я использую EntityManager, управляемый приложением, и, следовательно, я должен явно закрыть их в моем dao)
Я также перешел в диспетчер транзакций jta (для управления транзакциями в нескольких базах данных)
Вот так выглядит мой весенний xml.
...
<bean class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean" id="em_Rel1">
<property name="persistenceUnitName" value="PU1" />
</bean>
<bean class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean" id="em_Rel2">
<property name="persistenceUnitName" value="PU2" />
</bean>
<bean class="org.springframework.transaction.jta.JtaTransactionManager" id="jtaTransactionManager">
</bean>
<tx:annotation-driven transaction-manager="jtaTransactionManager"/>
....
Ура! (комментарии приветствуются)