Hibernate consultar 2 bancos

16 respostas
S

Ola pessoal estou com uma dúvida estou ainda engatinhando no Hibernate e me deparei com este problema, estou fazendo um projeto para estudar mais sobre o Hibernate entao nesse projeto tenho 2 telas de login que faz uma consulta com o banco A e se ele se logar cai numa tela de pesquisa que no caso ele pesquisa em um banco B ai que estra minha dúvida pq no persistence.xml tenho isso

<property name="hibernate.connection.url" value="jdbc:jtds:sqlserver://10.0.0.1:1433/BancoA"/>

que faz a conexao com o BancoA apenas!! Como vou conectar no BancoB?

Devo ter 2 arquivos persistence.xml ?

Tambem uso JSF e na minha applicationContext que uso para logar esta assim

<bean id="entityManagerFactory" 
       class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
        <property name="persistenceUnitName" value="BancoA" />
    </bean>
    
    <bean class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor" />
    
    <bean id="transactionManager" 
          class="org.springframework.orm.jpa.JpaTransactionManager">
        <property name="entityManagerFactory" ref="entityManagerFactory" />
    </bean>
    
    <tx:annotation-driven />
	
    <bean id="p2Dao" class="br.com.imc.dao.imp.P2DaoImp" />

Devo criar 2 applicatiomnContext também ? estou meio perdido qqr ajuda sera bem vinda

VLW.

16 Respostas

ralphsilver

O que vc precisa fazer é:

[list]dois persistence Unit dentro de um persistence.xml[/list]
[list]dois LocalContainerEntityManagerFactoryBean dentro do seu applicationContext[/list]
[list]dois transaction manager caso queira que o spring faça controle dos dois[/list]

Depois disso, basta injetar nos DAOs o entityManagerFactory que vc deseja utilizar

S

Fiz isso

dois persistence Unit dentro de um persistence.xml

dois LocalContainerEntityManagerFactoryBean dentro do seu applicationContext

dois transaction manager caso queira que o spring faça controle dos dois

e agora como faço para injeta no dao o enttity desejado … essa parte nao consigo ;~

ralphsilver

samuelM:
Fiz isso

dois persistence Unit dentro de um persistence.xml

dois LocalContainerEntityManagerFactoryBean dentro do seu applicationContext

dois transaction manager caso queira que o spring faça controle dos dois

e agora como faço para injeta no dao o enttity desejado … essa parte nao consigo ;~

Atualmente vc está injetando através da annotation PersistenceContext ?

S
import static javax.persistence.GenerationType.IDENTITY;

import java.io.Serializable;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.Table;

@Entity
@Table(name = "usuario")
public class Login implements Serializable {

    @Id
    @GeneratedValue(strategy = IDENTITY)
    private Integer usu_id;
    private String usu_nome;
//    private String usu_login;
    private String usu_senha;
    @OneToMany(mappedBy = "usuario", fetch = LAZY)
S
<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
        <property name="persistenceUnitName" value="nomedobanco" />
    </bean>
ralphsilver
samuelM:
import static javax.persistence.GenerationType.IDENTITY;

import java.io.Serializable;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.Table;

@Entity
@Table(name = "usuario")
public class Login implements Serializable {

    @Id
    @GeneratedValue(strategy = IDENTITY)
    private Integer usu_id;
    private String usu_nome;
//    private String usu_login;
    private String usu_senha;
    @OneToMany(mappedBy = "usuario", fetch = LAZY)

Esse é o mapeamento de uma entidade... eu quero saber como que vc injeta o EntityManager nas suas classes...
Para todos os casos... na configuraçao do seu persistence-unit... vc consegue setar as entidades que vc quer utilizar em cada uma delas... e para utilizar em uma classe.. basta vc espeficiar o persistence-unit-name que vc declarou no seu persistence.xml

S

eu postei depois das minhas entidades esta logo acima

ralphsilver

samuelM:
<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> <property name="persistenceUnitName" value="nomedobanco" /> </bean>

Ok… no seu bean,… vc espeficicou o id entityManager factory e setou o persistenceUnitName com o valor nomedobanco … estou supondo que uma das unidades de persistencia é esse…
agora… basta criar outrro entitymanager igual a esse mas com o persistenceUnitName com o valor do outro… troca o id do spring também senão vai dar pau…

A partir daí… basta vc injetar em alguma classe que vc for utilizar, seja por spring, seja por anotação de persistencia…

S

Desde ja agradeço sua atenção vou tentar aqui depois posto o resultado obrigado.

ralphsilver

Então… só para completar: de que forma vc utiliza o EntityManager? vc injeta ele nas classes através do spring ou vc utiliza a annotation @PersistenceContext ?

S
@SuppressWarnings("unchecked")
    @PersistenceContext
    public void setEntityManager(EntityManager em) {
        this.entityManager = em;
    }
ralphsilver

samuelM:
@SuppressWarnings("unchecked") @PersistenceContext public void setEntityManager(EntityManager em) { this.entityManager = em; }

então…

nesse ponto, vc vai ter que especificar qual persistence unit vc vai querer utilizar assim:

@SuppressWarnings("unchecked") @PersistenceContext(unitName="BancoA") public void setEntityManager(EntityManager em) { this.entityManager = em; }

S

saquei e o get continua mesma coisa

protected EntityManager getEntityManager() {
        if (entityManager == null) {
            throw new IllegalStateException("Erro");
        }
        return entityManager;
    }
ralphsilver

samuelM:
saquei e o get continua mesma coisa

protected EntityManager getEntityManager() { if (entityManager == null) { throw new IllegalStateException("Erro"); } return entityManager; }

sim… sem nenhum problema…

S

Certo a estrutura esta criado mas não consigo entender como injetar a dependencia do bancoA e do bancoB como falo para ele, consulte neste banco e agora neste?

Vlw mais uma vez.

ralphsilver

Então… tá ligado a annotation @PersistenceContext? Então… ele tem um campo chamado unitName … esse unitName deve ser preenchido com o unitname que vc especificou nas configurações no persistence.xml …

daí… na hora de usar… vc faria assim:

@PersistenceContext(unitName="bancoA") private EntityManager em1; @PersistenceContext(unitName="bancoB") private EntityManager em2;

Você não especifica o unitName quando tem apenas uma unidade de persistência porque realmente não precisa quando se tem apenas um… mas nesse caso vai dar pau se vc não especificar…

Criado 11 de setembro de 2012
Ultima resposta 18 de set. de 2012
Respostas 16
Participantes 2