Estou tentando configurar dois bancos no hibernate, pois o sistema precisa de dado de dois bancos diferentes. Eu imaginei algumas alternativas, mas ñ tenho certeza.
Um arquivo hibernate.cfg.xml com duas tags sessionFactory ou dois arquivos hibernate.cfg.xml.
Além da configuração normal, você pode criar uma outra classe que se conecta com outra base de dados.
public class ConnectionFactory {
private static SessionFactory factory;
private static final String user = "user";
private static final String password = "pass";
private static final String server = "127.0.0.1";
private static final String dataBaseName = "base_de_dados";
static {
Properties p = new Properties();
p.setProperty("hibernate.dialect","org.hibernate.dialect.SQLServerDialect");
p.setProperty("hibernate.connection.driver_class","com.microsoft.jdbc.sqlserver.SQLServerDriver");
p.setProperty("hibernate.connection.url", "jdbc:microsoft:sqlserver://" + server + ";DataBaseName=" + dataBaseName);
p.setProperty("hibernate.connection.username", user);
p.setProperty("hibernate.connection.password", password);
p.setProperty("hibernate.show_sql","true");
AnnotationConfiguration configuracao = new AnnotationConfiguration();
configuracao.setProperties(p);
configuracao.addAnnotatedClass(Classe.class);
factory = configuracao.buildSessionFactory();
}
/**
* Método que retorna uma sessão do hibernate com a conexão com o AutoRisco
*
* @return
*/
public Session getSession() {
return factory.openSession();
}
}
Você vai ter de trabalhar com dois objetos SessionFactory distintintos: um para cada banco. Infelizmente o Hibernate não trabalha com dois bancos de dados distintos como se fossem um só (o que inicialmente seria até bacana).
Se quiser criar relacionamentos entre entidades que são armazenadas em bancos distintos, vai ter de lançar mãos de alguns artifícios, como por exemplo criar getters e setters que sirvam apenas para fazer a conexão entre os dois bancos.
Exemplo: suponhamos que você tenha dois bancos. No banco A, armazena seus clientes. No banco B, armazena as compras dos seus clientes (eta exemplo ruim hein?).
Você teria um bean chamado Cliente com o seguinte código:
class Cliente {
String id;
String nome;
// getters e setters para cada propriedade, além do construtor padrão
}
E também teria a classe Compra com a seguinte estrutura:
class Compra {
String id;
Date data;
Cliente cliente;
/*
Getters e setters para os três campos acima
*/
// E um get e um set apenas para fazer o mapeamento pelo Hibernate
public String getIdCliente()
{
return getCliente().getId();
}
public void setIdCliente(String valor)
{
// Chame o código que instancia a classe Cliente a partir do seu Id.
}
}
A classe compra teria um campo chamado idCliente mapeado no seu arquivo do Hibernate. Isto iria tapear o Hibernate e criar um relacionamento virtual entre as duas classes, estando cada uma contendo seus dados persistidos em um banco de dados diferente.
Não sei se é uma solução elegante ou não, mas funciona. Espero que lhe seja de alguma utilidade. Precisando de alguma coisa, é só procurar.
Bom pessoal consegui,
Usei dois sessionFactory com dois hibernate.cfg. O Ideal seria usar o proprio hibernate.cfg configurando duas tags session factory e o resto seria o normal
Meu camarada poderia me mandar um exemplo de como vc está usando o sessionFactory com dois hibernate.cfg pois estou com o mesmo problema que vc tenho que utilizar duas conexões distintas. Se puder me mandar desde já agradeço pela ajuda.