Ainda não tem acesso? Estude com a gente! Matricule-se
Ainda não tem acesso? Estude com a gente! Matricule-se

Solucionado (ver solução)

Trabalhar com dois persistence-unit

Olá pessoal,

Preciso trabalhar com duas conexões para banco de dados dentro do meu projeto. Dei uma pesquisada e fiz os seguintes passos:

  • Criei dois persistence-unit no persistence.xml, com as duas conexões;
  • Alterei meu JPAUtil para carregar os dois persistences:
@PersistenceUnit(unitName = "pedidos")
    private static EntityManagerFactory emf = Persistence.createEntityManagerFactory("pedidos");

    @PersistenceUnit(unitName = "zanthus")
    private static EntityManagerFactory emfZanthus = Persistence.createEntityManagerFactory("zanthus");

    @Produces
    @Default
    public EntityManager getEntityManager() {
        return emf.createEntityManager();
    }

    @Produces
    @Zanthus
    public EntityManager getZanthus() {
        return emfZanthus.createEntityManager();
    }
...

Porém ao chamar o segundo persistence-unit no meu DAO, parece que ele não está apontando para ele e sim para o primeiro, pois ele aparece que a entidade não está mapeada.

Caused by: org.hibernate.hql.internal.ast.QuerySyntaxException: Material is not mapped [SELECT t FROM Material t WHERE t.codMercadoria = :pMaterial AND t.codLoja = :pLoja]

Esse é o conteúdo do meu persistence.xml

<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://xmlns.jcp.org/xml/ns/persistence"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_2.xsd"
    version="2.2">
    <persistence-unit name="pedidos">
        <!-- Implementação do JPA, no nosso caso Hibernate -->
        <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
        <!-- Aqui são listadas todas as entidades -->
        <class>br.com.bigsupermercados.pedidos.modelo.ItemPedido</class>
        <class>br.com.bigsupermercados.pedidos.modelo.PagamentoPedido</class>
        <class>br.com.bigsupermercados.pedidos.modelo.Pedido</class>
        <class>br.com.bigsupermercados.pedidos.modelo.Usuario</class>
        <class>br.com.bigsupermercados.pedidos.modelo.Cliente</class>
        <properties>
            <property name="javax.persistence.jdbc.driver"
                value="org.postgresql.Driver" />
            <property name="javax.persistence.jdbc.url"
                value="jdbc:postgresql://192.0.1.12/pedidos" />
            <property name="javax.persistence.jdbc.user"
                value="postgres" />
            <property name="javax.persistence.jdbc.password"
                value="123456" />

            <property name="hibernate.dialect"
                value="org.hibernate.dialect.PostgreSQLDialect" /> <!-- DB Dialect -->
            <property name="hibernate.hbm2ddl.auto" value="update" /> <!-- create / create-drop / update -->
            <property name="hibernate.show_sql" value="true" /> <!-- Show SQL in console -->
            <property name="hibernate.format_sql" value="true" /> <!-- Show SQL formatted -->
        </properties>
    </persistence-unit>

    <persistence-unit name="zanthus">
        <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
        <class>br.com.bigsupermercados.pedidos.modelo.Material</class>
        <properties>
            <property name="javax.persistence.jdbc.driver"
                value="com.microsoft.sqlserver.jdbc.SQLServerDriver" />
            <property name="javax.persistence.jdbc.url"
                value="jdbc:sqlserver://192.0.1.201:1433;databaseName=ZeusRetail" />
            <property name="javax.persistence.jdbc.user" value="sa" />
            <property name="javax.persistence.jdbc.password"
                value="BIG001sup" />

            <property name="hibernate.dialect"
                value="org.hibernate.dialect.SQLServerDialect" /> <!-- DB Dialect -->
            <property name="hibernate.show_sql" value="true" /> <!-- Show SQL in console -->
            <property name="hibernate.format_sql" value="true" /> <!-- Show SQL formatted -->
        </properties>
    </persistence-unit>
</persistence>

Essa entidade é apenas para o segundo DAO mesmo.

Alguém já passou por isso?

Obrigado,

3 respostas

Hum, nunca passei por isso. Mas o que eu faço no trabalho é criar uma view dentro do banco de dados principal chamando o outro banco de dados. Isso facilita muito o trabalho. E pasme é possível dar insert e update numa view que você tem acesso de escrita. Fantástico não é?

Olá André..

Só que irei trabalhar com Postgres e SQL Server. Sei que dá para criar um dblink ou um linked Server, porém não acho que esse seria o caminho.

Mas obrigado pela sua resposta.

solução

Consegui realizar a conexão com os dois bancos..

O persistence estava correto, porém eu tinha colocado um aliás para a entity. Foi fazer a query com esse nome do alias e o select retornou normalmente.