Duas aplicações utilizarem o mesmo banco de dados

E ae galera,

De boa?

Como eu devo configurar meu hibernate.cfg.xml para trabalhar com dois bancos de dados simultaneos.

Meu hibernate.cfg.xml

<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<property name="hibernate.connection.username">
csempre
</property>
<property name="hibernate.connection.password">
%+Pre16!
</property>
<property name="hibernate.connection.url">
jdbc:mysql://localhost/csempre_db
</property>

<!-- configuration pool via c3p0--> 
<property name="c3p0.acquire_increment">1</property> 
<property name="c3p0.idle_test_period">100</property> <!-- seconds --> 
<property name="c3p0.max_size">100</property> 
<property name="c3p0.max_statements">0</property> 
<property name="c3p0.min_size">10</property> 
<property name="c3p0.timeout">100</property> <!-- seconds --> 
<!-- DEPRECATED very expensive property name="c3p0.validate>-->
 
<property name="hibernate.connection.driver_class">
com.mysql.jdbc.Driver
</property>
<property name="hibernate.dialect">
org.hibernate.dialect.MySQL5InnoDBDialect
</property>
<property name="hibernate.hbm2ddl.auto">update</property>
<property name="show_sql">true</property>
<property name="format_sql">true</property>
<mapping class="br.com.softsol.compresempre.modelo.Acesso"/>
<mapping class="br.com.softsol.compresempre.modelo.Administrador"/>
<mapping class="br.com.softsol.compresempre.modelo.Auditoria"/>
<mapping class="br.com.softsol.compresempre.modelo.Atividade"/>
<mapping class="br.com.softsol.compresempre.modelo.Bairro"/>
<mapping class="br.com.softsol.compresempre.modelo.Cidade"/>
<mapping class="br.com.softsol.compresempre.modelo.CodigoFiscalOperacoesPrestacoes"/>
<mapping class="br.com.softsol.compresempre.modelo.CodigoSituacaoTributaria"/>
<mapping class="br.com.softsol.compresempre.modelo.Comissao"/>
<mapping class="br.com.softsol.compresempre.modelo.Desconto"/>
<mapping class="br.com.softsol.compresempre.modelo.Empresa"/>
<mapping class="br.com.softsol.compresempre.modelo.Estado"/>
<mapping class="br.com.softsol.compresempre.modelo.FormaPagamento"/>
<mapping class="br.com.softsol.compresempre.modelo.Fornecedor"/>
<mapping class="br.com.softsol.compresempre.modelo.Frete"/>
<mapping class="br.com.softsol.compresempre.modelo.Grupo"/>
<mapping class="br.com.softsol.compresempre.modelo.GrupoFornecedor"/>
<mapping class="br.com.softsol.compresempre.modelo.Item"/>
<mapping class="br.com.softsol.compresempre.modelo.MenorPreco"/>
<mapping class="br.com.softsol.compresempre.modelo.Orcamento"/>
<mapping class="br.com.softsol.compresempre.modelo.Produto"/>
<mapping class="br.com.softsol.compresempre.modelo.ProdutoDestaque"/>
<mapping class="br.com.softsol.compresempre.modelo.ProdutoEmpresa"/>
<mapping class="br.com.softsol.compresempre.modelo.RegimeTributario"/>
<mapping class="br.com.softsol.compresempre.modelo.Subgrupo"/>
<mapping class="br.com.softsol.compresempre.modelo.TipoProduto"/>
<mapping class="br.com.softsol.compresempre.modelo.Unidade"/>
<mapping class="br.com.softsol.compresempre.modelo.Usuario"/>
</session-factory>
</hibernate-configuration>

Eu tenho duas classes. Uma para criar a sessão e outra para criar a fábrica de sessão.

Criador de Session

package br.com.softsol.compresempre.infra;

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;

import org.hibernate.Session;

import br.com.caelum.vraptor.ioc.Component;
import br.com.caelum.vraptor.ioc.ComponentFactory;
import org.hibernate.SessionFactory;

/**
 * @author Wesley Martins
 * @last update 21/01/2013
 */
@Component
public class CriadorDeSession implements ComponentFactory<Session> {

	private SessionFactory factory;
	private Session session;

	public CriadorDeSession(SessionFactory factory) {
		this.factory = factory;
	}

	@PostConstruct
	public void abre() {
		this.session = factory.openSession();
	}

	public Session getInstance() {
		return this.session;
	}

	@PreDestroy
	public void fecha() {
		this.session.close();
	}
}

Fábrica de Sessão

[code]
package br.com.softsol.compresempre.infra;

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.AnnotationConfiguration;

import br.com.caelum.vraptor.ioc.ApplicationScoped;
import br.com.caelum.vraptor.ioc.Component;
import br.com.caelum.vraptor.ioc.ComponentFactory;

/**

  • @author Wesley Martins
  • @last update 21/01/2013
    */

@ApplicationScoped
@Component
public class CriadorDeSessionFactory implements
ComponentFactory<SessionFactory> {

private SessionFactory factory;

@PostConstruct
public void abre() {
	AnnotationConfiguration configuration = new AnnotationConfiguration();
	configuration.configure();
	this.factory = configuration.buildSessionFactory();
}

public SessionFactory getInstance() {
	return this.factory;
}

@PreDestroy
public void fecha() {
	this.factory.close();
}

}[/code]

No meu dao, eu chamo assim.

[code]
package br.com.softsol.compresempre.dao;

import java.util.List;

import org.hibernate.Session;
import org.hibernate.Transaction;
import br.com.caelum.vraptor.ioc.Component;
import br.com.softsol.compresempre.modelo.Acesso;

/**

  • @author Wesley Martins
  • @last update 21/01/2013
    */

@Component
public class AcessoDAO {

private final Session session;

public AcessoDAO(Session session) {
	this.session = session;
}

public void salva(Acesso acesso) {
	Transaction tx = session.beginTransaction();
	session.save(acesso);
	tx.commit();
}

}[/code]

Valeu!!!

Você vai precisar criar duas session factories, umas para cada banco, e assim, terá que ter 2 arquivos hibernate.cfg.xml.

Criar duas session factory é uma possibilidade, mas talvez não a ideal tendo em vista que é um objeto pesado e sempre mantemos como singleton. Se for possível fazer upgrade da sua verão, você pode utilizar o conceito de Multitenancy que é suportado de forma nativa no hibernate na versão 4, mas desde já adianto que se for utilizar é melhor utilizar versões após a 4.1.4, pois corrige alguns bugs…

Bem lembrando, tem essa nova função na versão 4 do Hibernate. Acho que no site da caelum, no blog deles, tem algo falando sobre isso.