Dúvida sessionFactory Hibernate

8 respostas
R

Estou desenvolvendo uma aplicação desktop que vai ser distribuída para várias empresas.Cada empresa vai ter o seu banco de dados.E todos se conectarão num único servidor.

Cada cliente vai ter configurado um id (ex: empresa1, empresa2, …) que quando ele iniciar a aplicação vai enviar para o servidor e o servidor vai direcionar ele para o banco de dados correto. (SessionFactory)

Quando um usuário da empresa1 conectar vai configurar o SessionFactory assim:
SessionFactory sessionFactory = new Configuration().configure("/empresa1.cfg.xml").buildSessionFactory();

Quando um usuário da empresa2 conectar vai configurar o SessionFactory assim:
SessionFactory sessionFactory = new Configuration().configure("/empresa2.cfg.xml").buildSessionFactory();

A minha dúvida é assim (se é possível, para não perder tempo tentando algo que não dê):

Quando o usuário da empresa1 conectar no sistema ele vai criar a sessionFactory dele e vai trabalhar no seu banco de dados.Quando um usuário da empresa2 conectar (o da empresa1 continua logado) ele vai usar conseguir usar o seu banco de dados ou vai usar o da empresa1? E o da empresa1 vai ser afetado?

Resumindo: O sessionFactory é baseado no servidor ou no cliente?

8 Respostas

ignacio83

Esse único servidor… É um servidor Java? Ou quando vc diz servidor que dizer um servidor de banco de dados?

R

Servidor Java que tem acesso ao banco de dados via hibernate…

P

Se os arquivos de configuração empresa2.cfg.xml e empresa1.cfg.xml
trazem bancos diferentes, cada cliente acessará o seu.

A menos que os arquivos apontem para o mesmo banco!

ignacio83

Sim é possível ter um SessionFactory para cada banco de dados.

Só tome o cuidado de instaciar somente um SessionFactory por banco de dados (empresa), ou seja cada SessionFactory deve ser instanciado somente uma vez, e sua referência deve ser obtida novamente para os futuros acessos.

R
Só tome o cuidado de instaciar somente um SessionFactory por banco de dados (empresa), ou seja cada SessionFactory deve ser instanciado somente uma vez, e sua referência deve ser obtida novamente para os futuros acessos.

Como eu faria isso? Criei um HibernateUtil, com o bloco static.
Só que tenho um problema: esse arquivo de configuração tem que ser dinâmico, como eu passo ele para o HibernateUtil saber qual banco de dados está conectando?

public class HibernateUtil {

	private static SessionFactory factory;
	
	static {
		
		AnnotationConfiguration cfg = new AnnotationConfiguration();
		cfg.configure("/hibernate.cfg.xml");
		
		cfg.addAnnotatedClass(xxx.class);
		
		
		factory = cfg.buildSessionFactory();
			
	}
	
	public Session getSession() {
		
		return factory.openSession();
		
	}
ignacio83

É apenas uma sugestão… Existem outras maneiras de ser fazer isso:

Eu não compilei esse código, talvez exista algum erro, mas acho que dá pra entender a idéia.

public class HibernateUtil {
   private final Map<String,SessionFactory> factoryMap = new HashMap<String,SessionFactory>();	
   public static String EMPRESA_1 = "/hibernate_1.cfg.xml";
   public static String EMPRESA_2 = "/hibernate_2.cfg.xml";

   //Empresa é uma constantes dessa classe...
   public static syncronized SessionFactory getSessionFactory( String empresa )
   {
      SessionFactory sessionFactory = factoryMap.get(empresa );
     
      //Cria a fábrica
      if(sessionFactory == null)
      {
          AnnotationConfiguration cfg = new AnnotationConfiguration();
          cfg.configure( empresa );
          cfg.addAnnotatedClass(xxx.class);	
          sessionFactory = cfg.buildSessionFactory();
          factoryMap.put(empresa,sessionFactory);
      } 

      return sessionFactory;
   }
	
   public static syncronized Session getSession(String empresa) {	
       // Vc pode usar a mesma lógica para obter a sessão
   }
R

Valeu mas fiz diferente :D

Quebrei a cabeça como fazer a factory estar inicializada como a mesma durante toda aplicação como se fosse uma variável global, até eu descobrir que se usava static para isso... :D (muito tempo longe do java... tenho que rever alguns conceitos :S)

Ficou assim:

private static SessionFactory factory;
	
	public void conectarBanco(String empresa_id) {	
		
		if(factory == null){
			
			System.out.println("Factory nula");
			AnnotationConfiguration cfg = new AnnotationConfiguration();
			cfg.configure("/" + empresa_id + ".cfg.xml");
			
			cfg.addAnnotatedClass(xxx.class);
			
			factory = cfg.buildSessionFactory();
			
		} else {
			
			System.out.println("Factory já existe: " + factory);
			
		}
		
			
	}
	
	public Session getSession() {
		
		return factory.openSession();
		
	}

Como trabalho com remote objects no Flex não sei se tem como passar argumentos para um construtor, e seria muito trabalhoso passar parametro para todos metodos dos daos fiz assim: Quando a aplicação iniciar faço a conexão pelo método e mantenho o factory numa variável estática.

Té mais

Se surgir alguma dúvida retorno!

R

Me precipitei…

Do jeito que fiz não dá certo.Porque uma variável estática para todo sistema.Vão todos acessar o mesmo banco de dados e a mesma factory…

Acho que o jeito é fazer como você falou, só que o problema maior é como passar esse id da empresa para o Java do Flex (construtor do remote object) … :S

Criado 21 de outubro de 2009
Ultima resposta 22 de out. de 2009
Respostas 8
Participantes 3