Hibernate consultar 2 bancos

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.

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

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 ;~

[quote=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 ;~[/quote]

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

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)
<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
        <property name="persistenceUnitName" value="nomedobanco" />
    </bean>

[quote=samuelM][code]
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)
[/code][/quote]

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

eu postei depois das minhas entidades esta logo acima

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

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…

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

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 ?

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

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

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; }

saquei e o get continua mesma coisa

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

[quote=samuelM]saquei e o get continua mesma coisa

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

sim… sem nenhum problema…

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.

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…