Como tabalhar com 2 bancos no Hibernate?(Banco Legado em Produção)

10 respostas
arthurminarini

ola pessoal tenho um banco em mysql que é de todo a aplicação só que tenho um banco de produção no sql server 2005 uma tabela que estou precisando dela qual a melhor forma de trabalhar? precisarei criar um HibernateUtil só pra eu dar um select naquela tabela?

10 Respostas

mateusprado

Leia sobre JTA(Java Transaction API)

[ ]s,

arthurminarini

ok se alguem tiver outra instrução obrigado

arthurminarini

será que isso é viavel?

Properties databaseAProperties = // get properties however you like   
   Properties databaseBProperties = // get properties however you like   
       
   SessionFactory databaseA  = new Configuration().configure("databaseA.cfg.xml").setProperties(databaseAProperties)  
   .buildSessionFactory();  
   SessionFactory databaseB = new Configuration().configure("databaseB.cfg.xml").setProperties(databaseBProperties)  
   .buildSessionFactory();
J

Precisei fazer isso a pouco tempo e utilizei isso aqui…

public class HibernateDAO {
.....
                protected Session sessao= null;
	protected Transaction transaction= null;
	
		
	/**
	 * Método que cria uma conexão com a base de dados MySQL
	 */
	protected void getConnectionA() {		
		this.sessao = HibernateUtil.getSession(HibernateUtil.MYSQL); // Abrindo uma sessão		
		this.transaction = sessao.beginTransaction(); // Iniciando uma transação		
	}
	
		
	/**
	 * Método que cria uma conexão com a base de dados DB2.
	 */
	protected void getConnectionB() {
		 this.sessao= HibernateUtil.getSession(HibernateUtil.SESSION_DB2); //Abrindo uma sessão
		 this.transaction= sessao.beginTransaction(); //Iniciando uma transação
	}
......

}

na classe HibernateUtil.

public class HibernateUtil {
                public static final int SESSION_MYSQL= 1;
	public static final int SESSION_DB2= 2;

	private static SessionFactory factoryMySQL;
	private static SessionFactory factoryDB2;

	public static final ThreadLocal session = new ThreadLocal();

	static {
		// Carrega configurações do Hibernate.
		carregaFactoryMySQL();
		carregaFactoryDB2();
	}

                private static void carregaFactoryMySQL() {
		String pathHibernateConfig = "hibernate_MySQL.cfg.xml";

		try {
			Configuration cfg = new Configuration();
			factoryMySQL = cfg.configure(pathHibernateConfig)
					.buildSessionFactory();

		} catch (Exception e) {
			e.printStackTrace();
			factoryMySQL = null;
		}
	}

	private static void carregaFactoryDB2() {
		String pathHibernateConfig = "hibernate_DB2.cfg.xml";

		try {
			Configuration cfg = new Configuration();
			factoryDB2 = cfg.configure(pathHibernateConfig)
					.buildSessionFactory();

		} catch (Exception e) {
			e.printStackTrace();
			factoryDB2 = null;
		}
	}

	
                public static Session getSession(int hibernateSessionKey) {
		Session ses = (Session) session.get();

		if (ses == null) {
			switch (hibernateSessionKey) {
			case SESSION_MYSQL:
				ses = getSessionMSQL();
				break;

			case SESSION_DB2:
				ses = getSessionDB2();
				break;
			}
		}
		return ses;
	}

	/**
	 * Fecha conexão com a base de dados.
	 */
	public static void closeSession() {
		Session s = (Session) session.get();
		if (s != null)
			s.close();
		session.set(null);
	}

	private static Session getSessionMYSQL() {
		Session ses = (Session) session.get();
		try {
			ses = factoryMYSQL.openSession();
			session.set(ses);

		} catch (Exception e) {
			e.printStackTrace();
		}

		return ses;
	}

	public static Session getSessionDB2() {
		Session ses = (Session) session.get();
		try {
			ses = factoryDB2.openSession();
			session.set(ses);

		} catch (Exception e) {
			e.printStackTrace();
		}

		return ses;
	}
}
......
arthurminarini

vlw mas, é o seguinte. eu tenho uma aplicação em mysql toda mapeada e funcinando só que em outro banco (legado) estou por enquanto precisando de somente uma tabela que é a de cidade. no meu banco mysql(não legado) tem na tabela de arquiteto o idCidade que no caso vai ser o id vindo la do banco legado. como poder dar um hql ou algo mais simples para que não comprometa o banco legado pois o hibernate vai tentar criar as minhas tabelas do não legado no banco legado ai eu estou perdido! :shock: entende minha situação?

arthurminarini

outra coisa tbm vou ter que criar a classe cidade e quando eu rodar a aplicação ela vai ser criada no meu banco não legado e não pode pois essa classe é somente para traser uma cidade do banco legado

então como mapear usando annotation essa tabela pro hibernate saber que é provinda de outro database(legado) e não deve ser criada nem atualizada e seus campos não podem sofrer mudanças apenas lidos

arthurminarini

e ai galera? :?

viniciuspadua

procure fazer um linked server no sql!
Com o linked server vc consegue acessar do sql para o o mysql.
Veja se existe algo semelhantea a linked server para mysql!
trabalho com o contrário e resolvi assim!

arthurminarini

ok vou dar uma olhada sobre linked server

arthurminarini

achei coisas sobre Java Connector Architecture mas exemplo nada.

alguem ai sabe como mapear uma tabela de um banco legado no hibernate?(eu uso JPA e Annotation)

Criado 28 de fevereiro de 2009
Ultima resposta 3 de mar. de 2009
Respostas 10
Participantes 4