Two Datasources and Entities get lost on which one to use.
Hey all... I'm trying to use 2 datasources, a MySQL and a PostgreSQL.
application-context.xml
Code:
<context:component-scan base-package="com.iconecta.global" />
<context:annotation-config />
<bean id="datasourceMySQL" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://integrator.i-next.psi.br/iconecta_sincronia" />
<property name="username" value="user" />
<property name="password" value="password" />
</bean>
<bean id="datasourcePostgreSQL" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="org.postgresql.Driver" />
<property name="url" value="jdbc:postgresql://localhost/radius" />
<property name="username" value="user" />
<property name="password" value="password" />
</bean>
<bean class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor">
<property name="defaultPersistenceUnitName" value="persistenceDialectPostgreSQL" />
</bean>
<bean id="persistenceUnitManager" class="org.springframework.orm.jpa.persistenceunit.DefaultPersistenceUnitManager">
<property name="persistenceXmlLocations">
<list value-type="java.lang.String">
<value>classpath:META-INF/mysql-persistence.xml</value>
<value>classpath:META-INF/postgresql-persistence.xml</value>
</list>
</property>
<property name="defaultDataSource" ref="datasourcePostgreSQL" />
<property name="dataSources">
<map>
<entry key="mysql" value-ref="datasourceMySQL" />
<entry key="postgresql" value-ref="datasourcePostgreSQL" />
</map>
</property>
<property name="defaultPersistenceUnitRootLocation" value="com.iconecta.global"></property>
</bean>
<bean id="entityManagerFactoryPostgreSQL" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="jpaVendorAdapter">
<bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter" p:showSql="true" />
</property>
<property name="persistenceUnitManager" ref="persistenceUnitManager" />
<property name="persistenceUnitName" value="persistenceDialectPostgreSQL" />
<property name="dataSource" ref="datasourcePostgreSQL" />
<!-- <property name="packagesToScan" value="com.iconecta.integrator" /> -->
</bean>
<bean id="entityManagerFactoryMySQL" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="jpaVendorAdapter">
<bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter" p:showSql="true" />
</property>
<property name="persistenceUnitManager" ref="persistenceUnitManager" />
<property name="persistenceUnitName" value="persistenceDialectMySQL" />
<property name="dataSource" ref="datasourceMySQL" />
<!-- <property name="packagesToScan" value="com.iconecta.radius" /> -->
</bean>
<bean id="transactionManagerMySQL" class="org.springframework.orm.jpa.JpaTransactionManager" p:entity-manager-factory-ref="entityManagerFactoryMySQL" />
<bean id="transactionManagerPostgreSQL" class="org.springframework.orm.jpa.JpaTransactionManager" p:entity-manager-factory-ref="entityManagerFactoryPostgreSQL" />
<jpa:repositories base-package="com.iconecta.integrator.repositories" transaction-manager-ref="transactionManagerMySQL" entity-manager-factory-ref="entityManagerFactoryMySQL"></jpa:repositories>
<jpa:repositories base-package="com.iconecta.radius.repositories" transaction-manager-ref="transactionManagerPostgreSQL" entity-manager-factory-ref="entityManagerFactoryPostgreSQL"></jpa:repositories>
mysql-persistence.xml
Code:
<?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="persistenceDialectMySQL" transaction-type="RESOURCE_LOCAL">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<class>com.iconecta.integrator.entities.Cliente</class>
<class>com.iconecta.integrator.entities.Nas</class>
<exclude-unlisted-classes>true</exclude-unlisted-classes>
<properties>
<property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5Dialect" />
<property name="hibernate.show_sql" value="true" />
</properties>
</persistence-unit>
</persistence>
postgresql-persistence.xml
Code:
<?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="persistenceDialectPostgreSQL" transaction-type="RESOURCE_LOCAL">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<class>com.iconecta.radius.entities.Bridge</class>
<exclude-unlisted-classes>true</exclude-unlisted-classes>
<properties>
<property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQL82Dialect" />
<property name="hibernate.show_sql" value="true" />
</properties>
</persistence-unit>
</persistence>
Main.java
Code:
@Component
public class Main {
Logger logger = LoggerFactory.getLogger(this.getClass());
public static void main(String[] args) {
AbstractApplicationContext context = new ClassPathXmlApplicationContext("classpath:META-INF/application-context.xml");
Main p = context.getBean(Main.class);
p.start(args);
}
@Autowired
ClienteRepository clienteRepository;
@Autowired
BridgeRepository bridgeRepository;
private void start(String[] args) {
List<Bridge> bridges = bridgeRepository.findAll();
for (Bridge b: bridges) {
logger.info(b.getNas());
}
List<Cliente> clientes = clienteRepository.findAll();
for (Cliente c: clientes) {
logger.info(c.getLogin());
break;
}
}
}
So, here's what happens... Once I run this code, BridgeRepository.findAll() gets logged as intended but when it tries to ClienteRepository.findAll() it actually tries to use the same the database as the BridgeRepository.
I was under the impression that <jpa:repositories> was supposed to avoid that in these 2 lines... Each package would be bound to a transaction and entities manager... But that's not what happens...
Code:
<jpa:repositories base-package="com.iconecta.integrator.repositories" transaction-manager-ref="transactionManagerMySQL" entity-manager-factory-ref="entityManagerFactoryMySQL"></jpa:repositories>
<jpa:repositories base-package="com.iconecta.radius.repositories" transaction-manager-ref="transactionManagerPostgreSQL" entity-manager-factory-ref="entityManagerFactoryPostgreSQL"></jpa:repositories>
Also, I might add I've tried to remove application-context.xml and start everything via code but I gave up trying to create the "persistenceUnitManager"... I can't find any documentation on how to do that on code.
Thanks in advance for any advice.