Dois bancos no Hibernate

Olá Pessoal,

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.

To precisando de umas opniões a respeito.

Desde já agradeço!

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

De qq forma valew a força ajudou muito :smiley:

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.

Ai vai meu exemplo everson_cardoso… caso lhe interesse é claro:

public class HibernateUtil 
{
    private static AnnotationConfiguration local;
    private static AnnotationConfiguration remote;
    private static SessionFactory sessionFactory;
    private static SessionFactory sessionFactoryRemote;
    //Criando uma threadLocal garantindo que seja reutilizada a sessao aberta, caso ja exista;
    private static final ThreadLocal<Session> threadLocal = new ThreadLocal<Session>();
    private static final ThreadLocal<Session> threadLocalRemote = new ThreadLocal<Session>();
    public static void start()
    {
        try
        {
            local = new AnnotationConfiguration();
            remote = new AnnotationConfiguration();
            Properties pLocal = new Properties();
            Properties pRemote = new Properties();
            /*Cria uma SessionFactory baseada na configuraçaao do arquivo hibernate.cfg.xml
			e setando o usuario e senha nas propriedades em tempo de execução.*/
            //config Firebird Standalone DATABASE
            pLocal.setProperty("hibernate.dialect","org.hibernate.dialect.FirebirdDialect");
            pLocal.setProperty("hibernate.connection.driver_class","org.firebirdsql.jdbc.FBDriver");
            //pLocal.setProperty("hibernate.connection.url", "jdbcfirebirdsql:embedded:DADOS/DADOS.FDB");
            pLocal.setProperty("hibernate.connection.url", "jdbc:firebirdsql://localhost:3050/D:/JAVA/MEUS PROJETOS/DataViewProjects/SimuladorApicultura/GestapiConsultor/dados/DADOS.fdb");
            pLocal.setProperty("hibernate.connection.charSet", "utf-8");
            pLocal.setProperty("hibernate.connection.username", "sysdba");
            pLocal.setProperty("hibernate.connection.password", "masterkey");
            pLocal.setProperty("hibernate.show_sql","true");
            pLocal.setProperty("current_session_context_class", "thread");
            pLocal.setProperty("hibernate.use_sql_comments", "true");
            pLocal.setProperty("hibernate.order_updates", "true");
//            pLocal.setProperty("hibernate.c3p0.min_size" , "5");
//            pLocal.setProperty("hibernate.c3p0.max_size" , "20");
//            pLocal.setProperty("hibernate.c3p0.timeout" , "400");
//            pLocal.setProperty("hibernate.c3p0.max_statements" , "50");
//            pLocal.setProperty("hibernate.c3p0.idle_test_period" , "3000");
//            pLocal.setProperty("hibernate.c3p0.acquire_increment" , "2");
            pLocal.setProperty("hibernate.jdbc.batch_size" , "30");
            pLocal.setProperty("max_fetch_depth" , "4");

            //config MySQL Remote SERVER
            pRemote.setProperty("hibernate.dialect","org.hibernate.dialect.MySQL5Dialect");
            pRemote.setProperty("hibernate.connection.driver_class","com.mysql.jdbc.Driver");
            pRemote.setProperty("hibernate.connection.url", "jdbc:mysql://xxx.xxx.xxx.xxx:3306/blablabla");
            pRemote.setProperty("hibernate.connection.charSet", "utf-8");
            pRemote.setProperty("hibernate.connection.username", "javaman");
            pRemote.setProperty("hibernate.connection.password", "guj");
            pRemote.setProperty("hibernate.show_sql","true");
            pRemote.setProperty("current_session_context_class", "thread");
            pRemote.setProperty("hibernate.use_sql_comments", "true");
            pRemote.setProperty("hibernate.order_updates", "true");
            pRemote.setProperty("hibernate.c3p0.min_size" , "5");
            pRemote.setProperty("hibernate.c3p0.max_size" , "20");
            pRemote.setProperty("hibernate.c3p0.timeout" , "400");
            pRemote.setProperty("hibernate.c3p0.max_statements" , "50");
            pRemote.setProperty("hibernate.c3p0.idle_test_period" , "3000");
            pRemote.setProperty("hibernate.c3p0.acquire_increment" , "2");
            pRemote.setProperty("hibernate.jdbc.batch_size" , "30");
            pRemote.setProperty("max_fetch_depth" , "4");

            local.setProperties(pLocal);
            local.addAnnotatedClass(DtCop.class);
            local.addAnnotatedClass(DtCustof.class);
            local.addAnnotatedClass(DtCustov.class);
            local.addAnnotatedClass(DtInvest.class);
            local.addAnnotatedClass(DtPerguntas.class);
            local.addAnnotatedClass(DtProd.class);
            local.addAnnotatedClass(DtRespostas.class);
            local.addAnnotatedClass(DtResult.class);
            local.addAnnotatedClass(DtSim.class);
            sessionFactory = local.buildSessionFactory();
            System.out.println("CONFIGURATION FACTORY LOCAL OK...");

            remote.setProperties(pRemote);
            remote.addAnnotatedClass(DtCop.class);
            remote.addAnnotatedClass(DtCustof.class);
            remote.addAnnotatedClass(DtCustov.class);
            remote.addAnnotatedClass(DtInvest.class);
            remote.addAnnotatedClass(DtPerguntas.class);
            remote.addAnnotatedClass(DtProd.class);
            remote.addAnnotatedClass(DtRespostas.class);
            remote.addAnnotatedClass(DtResult.class);
            remote.addAnnotatedClass(DtSim.class);
            sessionFactoryRemote = remote.buildSessionFactory();
            System.out.println("CONFIGURATION FACTORY REMOTE OK...");
        }
        catch (Exception e)
        {
            JOptionPane.showMessageDialog(null, e.getStackTrace(), "Criação da  SessionFactory falhou.", JOptionPane.ERROR_MESSAGE);
            e.printStackTrace();
            sessionFactory.close();
            sessionFactory = null;
            System.exit(0);
        }
    }

    public static Session getSession()
    {
        Session localSession = threadLocal.get();
        localSession = sessionFactory.openSession();
        threadLocal.set(localSession);
        return localSession;
    }
    public static Session getSessionRemote()
    {
        Session localSession = threadLocalRemote.get();
        localSession = sessionFactoryRemote.openSession();
        threadLocalRemote.set(localSession);
        return localSession;
    }

    public static void testeConnection() throws Exception
    {
        Session localSession = threadLocal.get();
        localSession = sessionFactory.openSession();
        threadLocal.set(localSession);
        localSession.close();
        System.out.println("CONNECTION LOCAL OK");
    }
    public static void testeConnectionRemote() throws Exception
    {
        Session localSession = threadLocalRemote.get();
        localSession = sessionFactoryRemote.openSession();
        threadLocalRemote.set(localSession);
        localSession.close();
        System.out.println("CONNECTION REMOTE OK");
    }
}