[RESOLVIDO] Hibernate + de uma Session para esquemas diferentes [ajuda]

Queria saber como faco para manter mais de uma sessao aberto no banco para o programa, no caso o programa vai usar mais de um esquema no banco, queria saber como fazer nessa situacao. Como vai ficar o cfg.xml do hibernate? e o hibernateutil? e a chamada para a sessao na classe?

[]'s

edit

soh para deixar bem claro as duas sessoes sao diferente, usando esquemas diferentes, senhas diferentes, entao nao quero simplesmente abrir duas sessoes no mesmo esquema.

alguem? atualmente estou fazendo assim:

hibernate.cfg.xml

[code]<?xml version="1.0" encoding="UTF-8"?>

org.hibernate.dialect.OracleDialect oracle.jdbc.OracleDriver url login senha
<!-- Use the C3P0 connection pool provider -->
<property name="hibernate.c3p0.min_size">3</property>
<property name="hibernate.c3p0.max_size">5</property>
<property name="hibernate.c3p0.timeout">300</property>
<property name="hibernate.c3p0.max_statements">50</property>
[/code]

HibernateUtil.java

[code]public class HibernateUtil {

private static SessionFactory sessionFactory;

static {
    try {
        sessionFactory = new Configuration().configure().buildSessionFactory();
    }
    catch (HibernateException ex) {
        throw new RuntimeException("Problema de configuração: " + ex.getMessage(), ex);
    }
}

public static final ThreadLocal threadSession = new ThreadLocal();

/**
 * 
 * @return
 * @throws org.hibernate.HibernateException
 */
@SuppressWarnings("unchecked")
public static Session currentSession() throws HibernateException {
    Session session = (Session) threadSession.get();
    
    // Abre uma nova sessão se uma não foi aberta ainda.
    if (session == null) {
        session = sessionFactory.openSession();
        threadSession.set(session);
    }
    return session;
}

/**
 * 
 * @throws org.hibernate.HibernateException
 */
@SuppressWarnings("unchecked")
public static void closeSession() throws HibernateException {
    Session session = (Session) threadSession.get();
    threadSession.set(null);
    if (session != null) {
        session.close();
    }
}

public HibernateUtil() {
}

}[/code]

aquisicao da conexao na classe

Session session = HibernateUtil.currentSession(); connection = session.connection();

o que eu teria que mudar para ter mais de uma sessao? no hibernate.cfg.xml nao deve ter muita coisa para fazer. IMAGINO eu que eh soh criar um outra sessao com um nome diferente, mas como vou fazer no HibernateUtil? e como vai ser a chamada da conexao nas classes?

Não entendi…
Vc que ter mais de uma sessão aberta no banco ou mais de um SessionFactory disponivel na aplicação?!?
Por exemplo… se vc quer ter uma sessão que seja commitada a cada request e uma sessão especial onde vc controle o commit, independente do request, vc precisa “duplicar” a variavel session no seu Hibernate util juntamente com os seus métodos, fazendo cada um trabalhar com a sessão de acordo com o que vc quer…

Agora, se vc tem dois bancos diferentes e quer acessar os dois no proprio Hibernate, vc precisa criar dois SessionFactories diferentes… novamente “duplicar” essa hibernate.cfg.xml *um pra cada banco) e fazer a “duplicação” no Hibernate Util…

Nunca trabalhei desse jeito… normalmente o que se faz é dar um Grant no esquema quando estão na mesma instancia ou um DBLink quando de instancias diferentes…

no meu caso a aplicacao tem que acessar dois bancos diferentes. tem algum tuto explicando como faco para configurar o hibernate para ter duas fabricas?

Se forem dois Schemas diferentes no mesmo banco de dados, basta você estipular em que e Schema está cada uma das suas Entity
Colocando um @Table na entity e estipulando o atributo Schema

agora se você vai usar dois bancos totalmente diferente que estão em duas maquinas diferentes.
Você pode fazer dois hibernates.cfg.xml e é só passar o nome do que você quer conectar
na hora que você executa o “configure()”.

Exemplo

sessionFactoryParaOBanco1 = cfg.configure("arquivo para o banco 1");
sessionFactoryParaOBanco2 = cfg.configure("arquivo para o banco 2");

Pra cada schema vai precisar de um arquivo cfg é uma SessionFactory diferente, daí vc monta uma Classe Singleton que tem um Map onde a chave será o nome do schema e o value será a SessionFactory referente, seria algo assim:[code]class HibernateUtil {
private static HibernateUtil instance = new HibernateUtil();
private Map<String, SessionFactory> map;

private HibernateUtil() {
	map = new HashMap<String, SessionFactory>();
	loadSessionFactory();
}

private void loadSessionFactory() {
	SessionFactory sessionFactory = new Configuration().configure("hibernate1.cfg.xml").buildSessionFactory();
	map.put("test", sessionFactory);
	
	sessionFactory = new Configuration().configure("hibernate2.cfg.xml").buildSessionFactory();
	map.put("homolog", sessionFactory);
	
	sessionFactory = new Configuration().configure("hibernate3.cfg.xml").buildSessionFactory();
	map.put("prod", sessionFactory);
}

public static HibernateUtil getInstance() {
	return instance;
}

public SessionFactory getSessionFactory(String schema) throws Exception {
	SessionFactory sessionFactory = map.get(schema);
	if(sessionFactory == null){
		throws new Exception("Schema não encontrado.");
	}
	return sessionFactory;
}

}[/code]

vlw ae pela ajuda pessoal, vou tentar colocar em prática as sugestões de vocês agora.

Opa vamos lá, comecei aqui a implementação sugerida pelo amigo corintiano :wink:

e estou tendo alguns problemas, vou postar aqui o log do erro e os arquivos, lá vai:

log do erro

[12/06/2008 11:39:04,419] WARN  [DefaultQuartzScheduler_Worker-2] (SessionFactoryObjectFactory.java:101) ### InitialContext did not implement EventContext ###
12/06/2008 11:39:04 br.gov.ce.seplag.cronmail.jobs.JobPLANOSMailSemanal execute
SEVERE: null
org.hibernate.HibernateException: No CurrentSessionContext configured!
        at org.hibernate.impl.SessionFactoryImpl.getCurrentSession(SessionFactoryImpl.java:542)
        at br.gov.ce.seplag.cronmail.businessLogic.CronMailManager.<init>(CronMailManager.java:38)
        at br.gov.ce.seplag.cronmail.jobs.JobPLANOSMailSemanal.execute(JobPLANOSMailSemanal.java:45)
        at org.quartz.core.JobRunShell.run(JobRunShell.java:202)
        at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:529)
12/06/2008 11:39:04 br.gov.ce.seplag.cronmail.jobs.JobSADMail execute
SEVERE: null
org.hibernate.HibernateException: No CurrentSessionContext configured!
        at org.hibernate.impl.SessionFactoryImpl.getCurrentSession(SessionFactoryImpl.java:542)
        at br.gov.ce.seplag.cronmail.businessLogic.CronMailManager.<init>(CronMailManager.java:35)
        at br.gov.ce.seplag.cronmail.jobs.JobSADMail.execute(JobSADMail.java:57)
        at org.quartz.core.JobRunShell.run(JobRunShell.java:202)
        at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:529)
12/06/2008 11:39:04 br.gov.ce.seplag.cronmail.jobs.JobPLANOSMail execute
SEVERE: null
org.hibernate.HibernateException: No CurrentSessionContext configured!
        at org.hibernate.impl.SessionFactoryImpl.getCurrentSession(SessionFactoryImpl.java:542)
        at br.gov.ce.seplag.cronmail.businessLogic.CronMailManager.<init>(CronMailManager.java:38)
        at br.gov.ce.seplag.cronmail.jobs.JobPLANOSMail.execute(JobPLANOSMail.java:47)
        at org.quartz.core.JobRunShell.run(JobRunShell.java:202)
        at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:529)

hibernateSAMD.cfg.xml

[code]<?xml version="1.0" encoding="UTF-8"?>

org.hibernate.dialect.OracleDialect oracle.jdbc.OracleDriver url user pass [/code]

hibernateSGPDO.cfg.xml

[code]<?xml version="1.0" encoding="UTF-8"?>

org.hibernate.dialect.OracleDialect oracle.jdbc.OracleDriver url user pass [/code]

HibernateUtil.java

[code]package br.gov.ce.seplag.cronmail.persistence;

import java.util.HashMap;
import java.util.Map;
import org.apache.log4j.Logger;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

public class HibernateUtil {

private static HibernateUtil instance = new HibernateUtil();
private Map<String, SessionFactory> map;

Logger logger = Logger.getLogger(HibernateUtil.class);

private HibernateUtil() {
    map = new HashMap<String, SessionFactory>();
    loadSessionFactory();
}

private void loadSessionFactory() {
    SessionFactory sessionFactory = null;
    
    sessionFactory = new Configuration().configure("hibernateSAMD.cfg.xml").buildSessionFactory();
    map.put("SAMD", sessionFactory);

    sessionFactory = new Configuration().configure("hibernateSGPDO.cfg.xml").buildSessionFactory();
    map.put("SGPDO", sessionFactory);
}

public static HibernateUtil getInstance() {
    return instance;
}

public SessionFactory getSessionFactory(String schema) throws Exception {
    SessionFactory sessionFactory = map.get(schema);
    if (sessionFactory == null) {
        logger.warn("SessionFactory retornou vazio!");
    }
    return sessionFactory;
}

}[/code]

recuperando a conexão

session = HibernateUtil.getInstance().getSessionFactory("SGPDO").getCurrentSession(); this.connection = session.connection();

e ai? alguem pode me dar uma ajuda?
[]'s

EDIT
Uma outra coisa que eu reparei no log de erro

[12/06/2008 11:39:00,984] INFO  [DefaultQuartzScheduler_Worker-2] (DriverManagerConnectionProvider.java:41) ### Using Hibernate built-in connection pool (not for production use!) ###

tipo assim eu to usando o c3p0, lah nos arquivos de configuração do hibernate (como vocês podem ver) eu defini as propriedades do c3p0, e o .jar da api ta no classpath da aplicação ? :?: :? :?:

o problema passado foi resolvido adicionando a seguinte linhe no arquivo de configuração do hibernate:

<property name="current_session_context_class">thread</property>

porem agora estou com outro problema, segue o log do erro

OBS: vou dar uma limpada nesse topico, diminuir os logs dos erros passados, pq a pagina ta demorando para carregar

12/06/2008 15:19:03 br.gov.ce.seplag.cronmail.jobs.JobSADMail execute SEVERE: null org.hibernate.HibernateException: connection is not valid without active transaction at org.hibernate.context.ThreadLocalSessionContext$TransactionProtectionWrapper.invoke(ThreadLocalSessionContext.java:297) at $Proxy14.connection(Unknown Source) at br.gov.ce.seplag.cronmail.businessLogic.CronMailManager.<init>(CronMailManager.java:36) at br.gov.ce.seplag.cronmail.jobs.JobSADMail.execute(JobSADMail.java:57) at org.quartz.core.JobRunShell.run(JobRunShell.java:202) at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:529) 12/06/2008 15:19:03 br.gov.ce.seplag.cronmail.jobs.JobPLANOSMailSemanal execute SEVERE: null org.hibernate.HibernateException: connection is not valid without active transaction at org.hibernate.context.ThreadLocalSessionContext$TransactionProtectionWrapper.invoke(ThreadLocalSessionContext.java:297) at $Proxy14.connection(Unknown Source) at br.gov.ce.seplag.cronmail.businessLogic.CronMailManager.<init>(CronMailManager.java:39) at br.gov.ce.seplag.cronmail.jobs.JobPLANOSMailSemanal.execute(JobPLANOSMailSemanal.java:45) at org.quartz.core.JobRunShell.run(JobRunShell.java:202) at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:529) 12/06/2008 15:19:03 br.gov.ce.seplag.cronmail.jobs.JobPLANOSMail execute SEVERE: null org.hibernate.HibernateException: connection is not valid without active transaction at org.hibernate.context.ThreadLocalSessionContext$TransactionProtectionWrapper.invoke(ThreadLocalSessionContext.java:297) at $Proxy14.connection(Unknown Source) at br.gov.ce.seplag.cronmail.businessLogic.CronMailManager.<init>(CronMailManager.java:39) at br.gov.ce.seplag.cronmail.jobs.JobPLANOSMail.execute(JobPLANOSMail.java:47) at org.quartz.core.JobRunShell.run(JobRunShell.java:202) at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:529) Exception in thread "Timer-0" java.lang.NullPointerException at com.mchange.v2.log.log4j.Log4jMLog$Log4jMLogger.isLoggable(Log4jMLog.java:255) at com.mchange.v2.resourcepool.BasicResourcePool$CullTask.run(BasicResourcePool.java:1934) at java.util.TimerThread.mainLoop(Timer.java:512) at java.util.TimerThread.run(Timer.java:462) Exception in thread "Timer-1" java.lang.NullPointerException at com.mchange.v2.log.log4j.Log4jMLog$Log4jMLogger.isLoggable(Log4jMLog.java:255) at com.mchange.v2.resourcepool.BasicResourcePool$CullTask.run(BasicResourcePool.java:1934) at java.util.TimerThread.mainLoop(Timer.java:512) at java.util.TimerThread.run(Timer.java:462)

Pronto, peguei um tempim hoje (agora) para testar, tinha faltado soh da o transaction.beggin() :roll:

valeu ae pela ajuda.

[]'s

Poderia disponibiliza sua HibernateUtil e seu hibernate.cfg.xml , por gentileza ???