Recriar SessionFactory

3 respostas
ronnytds

Galera, meu problema é o seguinte:
tenho um sistema que vai ser acessado por vários clientes, sendo que cada cliente
tem o seu próprio banco de dados, ou seja, para cada cliente eu tenho um arquivo xml de configuração do hibernate.
O cliente é identificado por uma chave que ele digita na hora do login. O sistema recupera a chave digitada,
descobre qual é o cliente e cria a SessionFactory com o arquivo xml de configuração correspondente ao cliente encontrado.
O problema acontece na hora que eu faço o logoff e tento fazer o login novamente, a partir do mesmo computador,
só que com outra chave, como se fosse outro cliente, pois o sistema não cria mais a SessionFactory.
Minha dúvida é: se eu acessar o sistema a partir de outro computador, uma nova SessionFactory é criada,
ou ela é compartilhada por todos os usuários do sistema, mesmo estando em computadores diferentes?
Abaixo segue o código da minha classe HibernateUtil:

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package modelo.persistencia;


import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.cfg.AnnotationConfiguration;
import org.hibernate.SessionFactory;

/**
 * Hibernate Utility class with a convenient method to get Session Factory object.
 *
 * @author Administrador
 */
public class HibernateUtil {
    private static SessionFactory sessionFactory;

     static {
         try {
             //Postgres
             //sessionFactory = new AnnotationConfiguration().configure("hibernate_postgres.cfg.xml").buildSessionFactory();
             
             //SQL Server - Desenvolvimento
             sessionFactory = new AnnotationConfiguration().configure("hibernate_desenvolvimento.cfg.xml").buildSessionFactory();
             
             //SQL Server - Cliente: Nazareno
             //sessionFactory = new AnnotationConfiguration().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 ConexaoHibernate() {
     }
}

3 Respostas

ronnytds

acabei de fazer um teste aqui, acessando de outro computador, e a SessionFactory não é criada novamente. Como posso fazer para obrigar a SessionFactory ser criada toda vez que o login for feito, ou então como posso trabalhar com a aplicação acessando vários bancos, fazendo o redirecionamento de acordo com a chave digitada?

romarcio

Acho que você deve ter uma sessionfactory para cada banco de dados.

E sua chave de identificação, deve servir para direcionar o cliente a sessionfactory referente.

Se não estou enganado, na documentação do Hibernate tem um exemplo com 2 SessionFactory.

ronnytds

blz cara, vou dar uma lida na documentação pra ver se acho alguma coisa.
vlw

Criado 29 de junho de 2011
Ultima resposta 29 de jun. de 2011
Respostas 3
Participantes 2