Bom dia,
Preciso configurar a minha aplicação para acessar 3 unidades de persistência localizadas em diferentes módulos (na verdade em dois componentes e uma aplicação), sendo que duas delas acessam a mesma base de dados.
pu1 -> db1
pu2 -> db1
pu3 -> db2
Tive problemas durante os testes da pu3 quando tentei configurar o PersistenceUnitManager.
Segue a configuração:
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
xmlns:tx="http://www.springframework.org/schema/tx" xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd">
<context:property-placeholder location="classpath:/jdbc.properties" />
<tx:annotation-driven transaction-manager="transactionManager1" />
<bean id="dataSource1"
class="org.springframework.jdbc.datasource.DriverManagerDataSource"
p:driverClassName="${driverClassName}" p:url="${url}"
p:username="${username}" p:password="${password}" />
<bean id="persistenceUnitManager"
class="org.springframework.orm.jpa.persistenceunit.DefaultPersistenceUnitManager">
<property name="dataSources">
<map>
<entry key="ds1" value-ref="dataSource1" />
</map>
</property>
</bean>
<bean
class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"
id="entityManagerFactory1" lazy-init="false">
<property name="dataSource" ref="dataSource1" />
<!-- ASSIM FUNCIONA -->
<property name="persistenceUnitName" value="pu1" />
<!-- SE EU DESCOMENTO, O TESTE FALHA -->
<!--<property name="persistenceUnitManager" ref="persistenceUnitManager" /> -->
</bean>
<bean id="transactionManager1" class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory" ref="entityManagerFactory1" />
</bean>
</beans>
Quando tento usar o persistenceUnitManager no entityManagerFactory1 o teste falha acusando o seguinte problema:
Caused by: java.lang.UnsupportedOperationException: The user must supply a JDBC connection
at org.hibernate.connection.UserSuppliedConnectionProvider.getConnection(UserSuppliedConnectionProvider.java:54)
at org.hibernate.jdbc.ConnectionManager.openConnection(ConnectionManager.java:446)
at org.hibernate.jdbc.ConnectionManager.getConnection(ConnectionManager.java:167)
at org.hibernate.jdbc.JDBCContext.connection(JDBCContext.java:142)
at org.hibernate.transaction.JDBCTransaction.begin(JDBCTransaction.java:85)
at org.hibernate.impl.SessionImpl.beginTransaction(SessionImpl.java:1463)
at org.hibernate.ejb.TransactionImpl.begin(TransactionImpl.java:60)
at org.springframework.orm.jpa.DefaultJpaDialect.beginTransaction(DefaultJpaDialect.java:70)
at org.springframework.orm.jpa.JpaTransactionManager.doBegin(JpaTransactionManager.java:332)
... 30 more
... Removed 24 stack frames
O teste passa quando eu comento o
<property name="persistenceUnitManager" ref="persistenceUnitManager" />
da configuração do entityManagerFactory1, e dessa forma eu não consigo mais usar múltiplas unidades de persistência.
Quando eu seto a propriedade defaultDataource no persistenceUnitManager, o teste também passa, o problema é que ele usa apenas o ds que eu indiquei, ou seja
pu1 -> db1
pu2 -> db1
pu3 -> db1 (e deveria ser o db2)
Pelo visto o que esta ocorrendo é que não estou sabendo como definir qual dataSource do persistenceUnitManager o meu entityManagerFactory1 deve utilizar.
Alguém poderia dar uma luz?
Muito obrigado!