Estou tentando configurar meu JPA pra acessar 2 bancos diferentes e não consigo encontrar a solução. Já dei uma pesquisada no fórum e pela internet e não achei uma solução definitiva. Alguém já trabalhou desta forma?
Pelo que pesquisei preciso de 2 arquivos persistence.xml e um persistenceXmlLocations na configuração do spring indicando os dois xmls.
Também preciso indicar no meu entityManager pra qual persistence-unit quero persistir. Então configurei usando desta forma:
DAO
@PersistenceContext(unitName = "PU1")
private EntityManager manager;
Minha aplicação está num Tomcat7. O servidor inicia mas quando vou abrir a aplicação no browser tenho este erro:
ERRO
org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'entityManagerFactory' is defined
org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeanDefinition(DefaultListableBeanFactory.java:527)
org.springframework.beans.factory.support.AbstractBeanFactory.getMergedLocalBeanDefinition(AbstractBeanFactory.java:1083)
org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:274)
org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:194)
org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1079)
org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter.lookupEntityManagerFactory(OpenEntityManagerInViewFilter.java:151)
org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter.lookupEntityManagerFactory(OpenEntityManagerInViewFilter.java:135)
org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter.doFilterInternal(OpenEntityManagerInViewFilter.java:94)
org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)
Segue minha configuração do spring para a parte de banco: SPRING
Não precisa não…
Vc pode configurar quantas persistence units vc quiser dentro de um mesmo persistence.xml…eu uso varios aqui.
No seu caso vc tem alterar a configuração do spring que gerencia e injeta os objetos JPA.
Saiba que é tudo estatico…
Fernando, tentei configurar o spring com o persistenceXmlLocations para 2 arquivos persistence.xml. Chegou a dar uma olhada na minha configuração? Tem toda a configuração pros dois bancos. Não dá erro de compilação e a aplicação sobe no tomcat. Quando eu abro no browser dá erro.
Se eu tento colocar 2 persistence-unit no persistence.xml, dá um warning dizendo que a aplicação não vai entender este segundo persistence-unit.
Você poderia postar algum exemplo pra eu tentar configurar aqui?
Veja que seu erro é de SPRING - No bean named ‘entityManagerFactory’ is defined. Vc mudou o nome para entityManagerFactory1 e entityManagerFactory2 mas não trocou as referencias…outra coisa, vc não precisa de 2 fabricas…1 só resolve.
Deixa do geito que tava, apenas use @PersistenceContext(unitName=“ABC”) com o nome da pu…q deve dar certo sim…
<!-- JPA -->
<!-- Gerenciador de EntityManagerFactory -->
<bean id="emf" class="org.springframework.orm.jpa.LocalEntityManagerFactoryBean">
<property name="persistenceUnitName" value="sistema" />
</bean>
<bean id="emf2" class="org.springframework.orm.jpa.LocalEntityManagerFactoryBean">
<property name="persistenceUnitName" value="puteste" />
</bean>
<!-- Gerenciador de transação -->
<bean id="transacaoJPA" class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory" ref="emf" />
<property name="dataSource" ref="poolBean" />
<property name="jpaDialect" ref="jpaDialect" />
</bean>
<bean id="transacaoJPA2" class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory" ref="emf2" />
<property name="dataSource" ref="poolBean" />
<property name="jpaDialect" ref="jpaDialect" />
</bean>
<!-- Localiza e faz auto DI para os bean com @Transaction -->
<tx:annotation-driven transaction-manager="transacaoJPA" />
<tx:annotation-driven transaction-manager="transacaoJPA2" />
<!-- Localiza e faz auto DI para os bean com @PersistenceContext -->
<bean class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor"/>[/code]
Declara nos seus beans gerenciados pelo spring qual é a unidade desejada…
[code]public class CirrusEaoImp<E extends Serializable, C extends Serializable>
implements CirrusEao<E, C>, Serializable {
@PersistenceContext(unitName="puteste")
protected EntityManager em;
/** Armazena o tipo da classe ORM mapeada. **/
private Class<E> tipo;
/** Construtor padrão. **/
@SuppressWarnings("unchecked")
public CirrusEaoImp() {
tipo = (Class<E>) ((ParameterizedType) getClass()
.getGenericSuperclass()).getActualTypeArguments()[0];
}[/code]
Vale lembrar que não existe propagação para transação entre as pu.
Outra coisa, eu li na documentação que a forma que vc fez é usado quando existe vários jar’s de jpa com diferentes unidades de persistências separadas que não seu caso…
Quando eu coloco 2 persistence-unit dentro do mesmo persistence.xml, aparece um warning: Multiple persistence units defined - only the first persistence unit will be recognized
Mesmo assim ignorei o warning e configurei como você colocou acima.
Ai no meu único bean que está mapeado pra segunda persistence unit, dá um erro: Class “pacote.bean.Carro” is mapped, but is not included in any persistence unit
[quote=tdisanti]Quando eu coloco 2 persistence-unit dentro do mesmo persistence.xml, aparece um warning: Multiple persistence units defined - only the first persistence unit will be recognized
Mesmo assim ignorei o warning e configurei como você colocou acima.
Ai no meu único bean que está mapeado pra segunda persistence unit, dá um erro: Class “pacote.bean.Carro” is mapped, but is not included in any persistence unit
Ainda deve estar faltando alguma coisa.
Tem uma luz? Acho que estamos perto!
Obrigado pela ajuda até agora [/quote]
Deve estar faltando algo sim…aqui funcionou…
veja meu context.xml:
[quote]Mas meu EntinyManager sempre retorna NULL!
[/quote]
Deve estar alguma coisa errado, pq eu ja teste e deu certo sim.
Não…não é isso…vamos la
Vc pode controlar o ciclo de vida destes objetos na unha…ou delegar para alguma coisa automática controlar para vc…Isso salva vc de ter que faze muito codigo propenso a erros…deixando vc focar diretamente no negocio da solução e não da infra…
No caso, o EJB container faz isso e o Spring tb.