Hibernate com vários Bancos de Dados

Boa Tarde!!!

Estou precisando criar uma aplicação onde a mesma terá dois bancos de dados, isso dependendo do Cliente logado, isso é possível?
Estou utilizando Flash Builder 4 + Java + Hibernate + Firebierd, caso conheçam, algum material, tutorial exemplo ou qualquer feedback que me auxilie ficarei grato.

Att
Bruno Sanches

Olhe, no hibernate tu pode configurar vários persistence-unit diferentes (no persistence.xml), e cada um é uma conexão diferente. Em tese tem algumas complicações (como por exemplo ter dois EntityManagerFactory’s), mas não é pra ser difícil.

Mas e pra logar, vai ser uma base só?

Rolou aqui um problema com esse caso ao tentar injetar dois EntityManager’s por spring, e a gente não conseguiu entender porque… tivemos que apelar para injeção de EntityManagerFactory, mas esse não é seu caso, é?

Cintia, pra falar a verdade estou começando tanto em flex quanto java, eu programo mais em PHP, comecei esse projeto aos trancos e barrancos para aumentar meus conhecimentos.

O que estou fazendo é o seguinte:

minha entity

package br.com.ehweb.business.entitys;

public class Cursos {
	
	private int curCodigo;
	private String curDescricao;
	private String curTipoEnsino;
	private String curHabilitacao;
	private String curLeiReconhecimento;
	
	public Cursos() {}

	gets e sets .....	
}

minha Interface

package br.com.ehweb.business.repositorys;

import java.util.List;

import br.com.ehweb.business.entitys.Cursos;

public interface ICursos {
	public void insertEdit(Cursos cursos) throws Exception;  
	public List<Cursos> getList() throws Exception; 
	public void del(Cursos cursos) throws Exception;
}

meu DAO

package br.com.ehweb.data.daos;

import java.util.List;

import org.hibernate.classic.Session;

import HibernateUtil.HibernateUtil;
import br.com.ehweb.business.entitys.Cursos;
import br.com.ehweb.business.repositorys.ICursos;

public class CursosDAO implements ICursos {
	
	private final Session sessao = HibernateUtil.getSessao("hibernate.cfg.xml");

	@Override
	public void insertEdit(Cursos cursos) throws Exception {
		sessao.saveOrUpdate(cursos);
		sessao.flush();
		sessao.close();
	}

	@Override
	public void del(Cursos cursos) throws Exception {
		sessao.delete(cursos);
		sessao.flush();
		sessao.close();
		
	}

	@SuppressWarnings("unchecked")
	@Override
	public List<Cursos> getList() throws Exception {
		List<Cursos> lista = sessao.createQuery("FROM cursos").list();
		sessao.flush();
		sessao.close();
		return lista;
	}
}

HibernateUtil

package HibernateUtil;

import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import javax.swing.JOptionPane;

public class HibernateUtil
{
    private static SessionFactory FabricaSessoes;
   
    

    public static org.hibernate.classic.Session getSessao(String conectar)
    {  
        try
        {
            FabricaSessoes = new Configuration().configure(conectar).buildSessionFactory();   
        }
        catch(Exception erro)
        {
            JOptionPane.showMessageDialog(null, "Erro na fabrica de sessoes = "+erro);
            FabricaSessoes = null;
        }   
    	
    	FabricaSessoes.close();
    	return (org.hibernate.classic.Session) FabricaSessoes.openSession();
    }	
 }

hibernate.cfg.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC 
    "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">

<hibernate-configuration> 
	<session-factory> 
		<property name="hibernate.connection.driver_class"> 
			com.mysql.jdbc.Driver 
		</property> 
		<property name="hibernate.connection.url"> 
			jdbc:mysql://localhost/CrudJavaFlexHibernate
		</property> 
		<property name="hibernate.connection.username"> 
			User 
		</property> 
		<property name="hibernate.connection.password"> 
			XXXXXX 
		</property> 
		<property name="hibernate.connection.dialect"> 
			org.hibernate.dialect.MySQLInnoDBDialect 
		</property>
		<property name="show_sql">true</property> 

		<mapping resource="br/com/ehweb/business/repositorys/hbm/Cursos.hbm.xml" />
	</session-factory>  
</hibernate-configuration>

E o mapeamento do Curso

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC 
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
    
<hibernate-mapping>
	<class name="br.com.ehweb.business.entitys.Cursos" table="cursos">
		<id name="curCodigo" column="CUR_CODIGO" type="int" />
		<property name="curDescricao" column="CUR_DESCRICAO" />
		<property name="curTipoEnsino" column="CUR_TIPO_ENSINO" />
		<property name="curHabilitacao" column="CUR_HABILITACAO" />
		<property name="curLeiReconhecimento" column="CUR_LEI_RECONHECIMENTO" />
	</class>	
</hibernate-mapping>

E para finalizar o remoting-config.xml

<?xml version="1.0" encoding="UTF-8"?>
<service id="remoting-service" 
    class="flex.messaging.services.RemotingService">

    <adapters>
        <adapter-definition id="java-object" class="flex.messaging.services.remoting.adapters.JavaAdapter" default="true"/>
    </adapters>

    <default-channels>
        <channel ref="my-amf"/>
    </default-channels>
    
    <destination id="Cursos">
        <properties>
            <source>br.com.ehweb.data.daos.CursosDAO</source>                    
        </properties>
    </destination>
    
    <destination id="CursosPadrao">
        <properties>
            <source>br.com.ehweb.data.daos.PadraoDAO</source>                    
        </properties>
    </destination>
</service>

Só para constar testei o insertEdit e está funcionando perfeitamente, só que agora preciso adaptar para que dependendo do Cliente conectado acesse um determinado Banco.
Esta aplicação também vai ter dois banco por Cliente.

Alguém tem uma dica, desde já muito obrigado

Eu ja utilizei 2 bancos e fiz um hibernate.cfg.xml pra cada banco. Dependendo de qual banco que eu queria acessar eu fazia uma SessionFactory com o hibernate.cfg.xml do banco especifico e a troca de informacoes entre os bancos fazia via os arquivos entity.

Blz, Basilio, vou tentar, acredito que realmente vá funcionar, o problema é a divisão por cliente, será que vou ter de criar um hibernate-cfg.xml para cada um???

Não sei qual a regra que vc vai usar, mas pra logar o cliente eu acredito que vc vai precisar acessar sempre o mesmo banco (o que tem o login, senha, etc do cliente). Logado o cliente vc pode escolher qual hibernate-cfg.xml vc vai usar pra configurar o SessionFactory(cada arquivo tera um nome, tipo: hibernate1-cfg.xml e hibernate2-cfg.xml). Mas vc so vai precisar de um arquivo pra cada banco, e nao um pra cada cliente.

Bom dia,

Com o hibernate Shards dá pra ter um configuração bem transparente de vários bancos.
Dê uma olhada no site oficial (http://www.hibernate.org/subprojects/shards.html) e também tem um exemplo legal na revista MundoJ 45 (http://www.mundoj.com.br/default.jsp).
T+

Será o mesmo Banco para login sim, porém não entendi a outra parte que você disse.
Se tenho de usar um arquivo por banco e minha aplicação terá dois banco, para cada cliente serão dois arquivos diferentes (hibernateCli1_1-cfg.xml e hibernateCli1_2-cfg.xml / hibernateCli2_1-cfg.xml e hibernateCli2_2-cfg.xml etc…) seria isso?

[quote=rdsilio]Bom dia,

Com o hibernate Shards dá pra ter um configuração bem transparente de vários bancos.
Dê uma olhada no site oficial (http://www.hibernate.org/subprojects/shards.html) e também tem um exemplo legal na revista MundoJ 45 (http://www.mundoj.com.br/default.jsp).
T+[/quote]

Bom Dia, valeu rdsilio, vou dar uma olhada, mais desde já muito obrigado.

Procurando mais informações com a dica que você me deu encontrei esse artigo: http://www.ibm.com/developerworks/br/opensource/library/os-hibernatesaas/, dei uma lida rápida mais acredito que vai funcionar para o que eu quero, vou ver só como vou configurar.

A revista MundoJ 45 é deste mês e vai demorar cerca de vai demorar 10 dias para chegar caso eu compre, infelizmente não posso esperar muito, mais valeu pela dica, não conhecia a revista, vou ficar mais atento a ela.

Abs

[quote=MaktubBruno]Será o mesmo Banco para login sim, porém não entendi a outra parte que você disse.
Se tenho de usar um arquivo por banco e minha aplicação terá dois banco, para cada cliente serão dois arquivos diferentes (hibernateCli1_1-cfg.xml e hibernateCli1_2-cfg.xml / hibernateCli2_1-cfg.xml e hibernateCli2_2-cfg.xml etc…) seria isso?[/quote]

Sim. Só pra me esclarecer, é uma aplicação Web ou é um sistema que vc tem 2 programas diferentes(2 clientes)?

[quote=Basilio][quote=MaktubBruno]Será o mesmo Banco para login sim, porém não entendi a outra parte que você disse.
Se tenho de usar um arquivo por banco e minha aplicação terá dois banco, para cada cliente serão dois arquivos diferentes (hibernateCli1_1-cfg.xml e hibernateCli1_2-cfg.xml / hibernateCli2_1-cfg.xml e hibernateCli2_2-cfg.xml etc…) seria isso?[/quote]

Sim. Só pra me esclarecer, é uma aplicação Web ou é um sistema que vc tem 2 programas diferentes(2 clientes)?[/quote]

Será uma aplicação Web e para front-end vou usar Flex 4.