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
postgresql-persistence.xmlCode:<?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>
Main.javaCode:<?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>
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.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; } } }
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...
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.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>
Thanks in advance for any advice.


Reply With Quote