Image

Spring+Hibernate+JPA+2 DB

Уважаемое сообщество,

некоторое время пытаюсь решить задачу работы приведенных выше фреймворков с двумя базами данных (MSSQL и MySQL). Процесс поиска решения запечатлен здесь.

Собственно, на данный момент, проблема состоит в том, что имея разные бины для каждой БД, в логах все равно фиксируется появление MSSQL для каждой entityManagerFactory.

Поэтому, прошу поделится подобным опытом конфигурирования и использования, если таковой имеется.
 

datasource-context.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
   
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
   
xsi:schemaLocation="http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
        http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd
        http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-2.5.xsd"

   
xmlns:p="http://www.springframework.org/schema/p" xmlns:tx="http://www.springframework.org/schema/tx"
   
xmlns:util="http://www.springframework.org/schema/util">

   
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
       
destroy-method="close" p:driverClassName="${local.jdbc.driver}" p:url="${local.jdbc.url}"
       
p:username="${local.jdbc.username}" p:password="${local.jdbc.password}">
   
</bean>

   
<bean id="dataSourceRemote" class="org.apache.commons.dbcp.BasicDataSource"
       
destroy-method="close" p:driverClassName="${remote.jdbc.driver}"
       
p:url="${remote.jdbc.url}" p:username="${remote.jdbc.username}"
       
p:password="${remote.jdbc.password}">
   
</bean>

   
<bean
       
class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor">
       
<property name="defaultPersistenceUnitName" value="pu1" />
   
</bean>

   
<bean id="persistenceUnitManager"
       
class="org.springframework.orm.jpa.persistenceunit.DefaultPersistenceUnitManager">
       
<property name="persistenceXmlLocation" value="${persistence.xml.location}" />
       
<property name="defaultDataSource" ref="dataSource" /> <!-- problem -->
       
<property name="dataSources">
               
<map>
                       
<entry key="local" value-ref="dataSource" />
                       
<entry key="remote" value-ref="dataSourceRemote" />
               
</map>
       
</property>
   
</bean>

   
<bean id="entityManagerFactory"
       
class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
       
<property name="jpaVendorAdapter">
               
<bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"
                       
p:showSql="true" p:generateDdl="true">
               
</bean>
       
</property>
       
<property name="persistenceUnitManager" ref="persistenceUnitManager" />
       
<property name="persistenceUnitName" value="pu1" />
       
<property name="dataSource" ref="dataSource" />
   
</bean>

   
<bean id="entityManagerFactoryRemote"
       
class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
       
<property name="jpaVendorAdapter">
               
<bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"
                       
p:showSql="true" p:generateDdl="true">
               
</bean>
       
</property>
       
<property name="persistenceUnitManager" ref="persistenceUnitManager" />
       
<property name="persistenceUnitName" value="pu2" />
       
<property name="dataSource" ref="dataSourceRemote" />
   
</bean>

   
<tx:annotation-driven />

   
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"
       
p:entity-manager-factory-ref="entityManagerFactory" />


   
<bean id="transactionManagerRemote" class="org.springframework.orm.jpa.JpaTransactionManager"
       
p:entity-manager-factory-ref="entityManagerFactoryRemote" />

</beans>

persistence.xml
 

<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence"
   
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence
                         http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd"

   
version="1.0">

   
<persistence-unit name="pu1" transaction-type="RESOURCE_LOCAL">
       
<properties>
               
<property name="hibernate.ejb.naming_strategy" value="org.hibernate.cfg.DefaultNamingStrategy" />
               
<property name="hibernate.dialect" value="${local.hibernate.dialect}" />
               
<property name="hibernate.hbm2ddl.auto" value="${local.hibernate.hbm2ddl.auto}" />                                              
       
</properties>
   
</persistence-unit>

   
<persistence-unit name="pu2" transaction-type="RESOURCE_LOCAL">
       
<properties>
               
<property name="hibernate.ejb.naming_strategy" value="org.hibernate.cfg.DefaultNamingStrategy" />
               
<property name="hibernate.dialect" value="${remote.hibernate.dialect}" />
               
<property name="hibernate.hbm2ddl.auto" value="${remote.hibernate.hbm2ddl.auto}" />
       
</properties>
   
</persistence-unit>

</persistence>