Spring + JPA2 com multiplos datasources e persistence contexts

0 respostas
danielsudpr

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!

Criado 30 de agosto de 2010
Respostas 0
Participantes 1