Configurar ApplicationContext para utilizar dois bancos de dados distintos

Pessoal é o seguinte, estou precisando muito de um ajuda, meu caso é o seguinte:

Tenho uma aplicação utilizando JSF,Spring,Hibernate…

nela tenho um arquivo persistence.xml onde coloco as configurações do meu banco de dados, no caso postgree. Tenho também um arquivo applicationContext que contém as configurações do Spring e contém também o entityManagerFactory apontando para esse meu persistence.
Vamos lá…eu utilizava então só o banco postgree só que agora em um cadastro na minha aplicação preciso fazer uma consulta em um banco oracle para validar um campo.

Adicionei as configurações desse banco no meu persistence.xml mas no applicationContext não sei como proceder.

Alguém poderia me ajudar?..

Segue meu persistence.xml:

<— BANCO POSTGREE

	<provider>org.hibernate.ejb.HibernatePersistence</provider>

	<properties>
		<property name="hibernate.archive.autodetection" value="class, hbm" />

		<property name="hibernate.hbm2ddl.auto" value="update"/>

		<!--Configuracoes de dialeto e conexao-->
		<property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQLDialect" />
		<property name="hibernate.connection.driver_class" value="org.postgresql.Driver" />
		<property name="hibernate.connection.url" value="jdbc:postgresql://localhost:5432/desenvolvimento" />
		<property name="hibernate.connection.username" value="postgres" />
		<property name="hibernate.connection.password" value="root" />

		<!--Configuracoes de Debug-->
		<property name="hibernate.show_sql" value="true" />
		<property name="hibernate.format_sql" value="true" />
		<property name="use_sql_comments" value="true" />
		

        <!--Configuracao do pool de c3p0-->           
        <property name="hibernate.c3p0.min_size" value="2" />
        <property name="hibernate.c3p0.max_size" value="20" />
        <property name="hibernate.c3p0.timeout" value="300" />
        <property name="hibernate.c3p0.max_statements" value="50" /> 
        <property name="hibernate.c3p0.idle_test_period" value="3000"/>                      

	</properties>
	
</persistence-unit>

<persistence-unit name="gemedOracle"> [b]<---BANCO ORACLE[/b]

	<provider>org.hibernate.ejb.HibernatePersistence</provider>

	<properties>
		<property name="hibernate.archive.autodetection"
			value="class, hbm" />

		<!--Configuracoes de dialeto e conexao-->
		<property name="hibernate.dialect" value="org.hibernate.dialect.OracleDialect" />
		<property name="hibernate.connection.driver_class" value="oracle.jdbc.driver.OracleDriver" />
		<property name="hibernate.connection.url" value="jdbc:oracle:thin:@oros:1521:COGERH" />
		<property name="hibernate.connection.username" value="adm_outorga" />
		<property name="hibernate.connection.password" value="outorga" />

		<!--Configuracoes de Debug-->
		<property name="hibernate.show_sql" value="true" />
		<property name="hibernate.format_sql" value="true" />
		<property name="use_sql_comments" value="true" />
		

        <!--Configuracao do pool de c3p0-->           
        <property name="hibernate.c3p0.min_size" value="2" />
        <property name="hibernate.c3p0.max_size" value="20" />
        <property name="hibernate.c3p0.timeout" value="300" />
        <property name="hibernate.c3p0.max_statements" value="50" /> 
        <property name="hibernate.c3p0.idle_test_period" value="3000"/>                      

	</properties>
</persistence-unit>

Meu applicationContext:

<bean id="entityManagerFactory"
	class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
	<property name="persistenceUnitName" value="cogerhPostgresDesenvolvimento" /> [b]<--- AQUI TENHO APENAS UM BANCO, GOSTARIA DE DECLARAR O OUTRO.[/b]
</bean>
	
<!-- Classe responsavel pela gestao das transacoes -->
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
	<property name="entityManagerFactory" ref="entityManagerFactory" />
</bean>


<!-- Marcacao de transacoes atraves de anotacoes -->
<tx:annotation-driven transaction-manager="transactionManager"/>


<!-- Identifica os beans anotados com @Service, @Repository, @Controller -->
<context:component-scan base-package="*" />

<!-- Habilita a configuracao do bena via anotacoes sem a necessidade de usar PersistenceAnnotationBeanPostProcessor -->
<context:annotation-config />

<!-- Faz a injecao de dependencia automaticamente -->
<bean class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor" />

<!-- Permite tratar exceções conhecidas do JPA para Spring -->
<bean class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor" />

<bean class="org.springframework.orm.jpa.support.OpenEntityManagerInViewInterceptor"/>

Trovan,

Você está conseguindo levantar a aplicação? Estou tendo um problema e estou seguindo a mesma coisa que você.

Obrigado pela ajuda.

Fala bland,

Cara estou conseguindo sim levantar minha aplicação, o unico problema é que não consigo utilizar dois bancos distintos na minha aplicação. A solução que tive temporária para utilizar dois bancos foi criar uma classe que faz a conexão via jdbc puro, porém gostaria de um solução melhor, seguindo esse mesmo caminho que já faço para utilizar um banco.

Qual o problema que vc está tendo?

Olá Trovan,

Cara, eu não estou conseguindo levantar a aplicação. O Spring não consegue “enxergar” uma persistence-unit no persistence.xml (que encontra-se dentro da pasta META-INF).

Vai o código abaixo:

appicationContext.xml

[code]<context:property-placeholder location=“classpath:/jdbc.properties” />

<bean id=“pgDataSource"
class=“org.springframework.jdbc.datasource.DriverManagerDataSource"
p:url=”${url}“
p:driverClassName=”${driverClassName}“
p:username=”${username}“
p:password=”${password}” />

<bean id="persistenceUnitManager"
class=“org.springframework.orm.jpa.persistenceunit.DefaultPersistenceUnitManager”>
<property name=“defaultDataSource” ref=“pgDataSource” />
</bean>

<bean id="entityManagerFactory"
class=“org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean”>
<property name=“persistenceUnitManager” ref=“persistenceUnitManager” />
<property name=“persistenceUnitName” value=“developer”/>
</bean>
[/code]

persistence.xml

&lt;persistence-unit name="developer"&gt; &lt;provider&gt;org.hibernate.ejb.HibernatePersistence&lt;/provider&gt; &lt;class&gt;com.monteirosti.domain.entity.Product&lt;/class&gt; &lt;properties&gt; &lt;property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQLDialect" /&gt; &lt;property name="hibernate.hbm2ddl.auto" value="create-drop" /&gt; &lt;property name="hibernate.show_sql" value="true" /&gt; &lt;property name="hibernate.format_sql" value="true" /&gt; &lt;/properties&gt; &lt;/persistence-unit&gt;

E dessa maneira está sempre dando esse erro:

[quote]org.springframework.beans.factory.BeanCreationException: Error creating bean with name ‘entityManagerFactory’ defined in ServletContext resource [/WEB-INF/applicationContext.xml]: Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: No persistence unit with name ‘developer’ found
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1338)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:473)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory$1.run(AbstractAutowireCapableBeanFactory.java:409)
at java.security.AccessController.doPrivileged(Native Method)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:380)
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:264)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:261)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:185)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:164)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:423)
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:728)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:380)
at org.springframework.web.context.ContextLoader.createWebApplicationContext(ContextLoader.java:255)
at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:199)
at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:45)
at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:3934)
at org.apache.catalina.core.StandardContext.start(StandardContext.java:4429)
at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045)
at org.apache.catalina.core.StandardHost.start(StandardHost.java:722)
at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045)
at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:443)
at org.apache.catalina.core.StandardService.start(StandardService.java:516)
at org.apache.catalina.core.StandardServer.start(StandardServer.java:710)
at org.apache.catalina.startup.Catalina.start(Catalina.java:583)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:288)
at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:413)
Caused by: java.lang.IllegalArgumentException: No persistence unit with name ‘developer’ found
at org.springframework.orm.jpa.persistenceunit.DefaultPersistenceUnitManager.obtainPersistenceUnitInfo(DefaultPersistenceUnitManager.java:379)
at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.determinePersistenceUnitInfo(LocalContainerEntityManagerFactoryBean.java:244)
at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:196)
at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:291)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1369)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1335)
… 30 more[/quote]

Vale lembrar que estou usando o Maven, dentro do Eclipse, mas está tudo sendo enviado corretamente para o servidor de aplicação. Ainda não instalei a base dados, mas acredito que o Srping não venha a tentar fazer uma conexão com a base assim que a aplicação está sendo iniciada.

Se você puder me ajudar, ficarei grato.

Alguém que tenha passado por esse problema, pode me ajudar?

Consegui solucionar. A pasta META-INF estava em local incorreto. Coloquei essa pasta dentro da pasta src/main/resources.