[RESOLVIDO]Tela de Login escolher schema do Mysql com hibernate.properties

5 respostas
daniellfeijo

Senhores,

Meu sistema até agora está simples e prático. Porém estou com um problema. Comecei a desenvolver esse sistema a pedido de duas pessoas. Tenho que tratar os dois com base de dados diferentes. Queria adicionar um campo na minha tela de login onde eles colocariam o nome da sua base de dados juntamente com seu usuario e senha.  li muita coisa aqui na net mas achei tudo que vi muito confuso. Bem... Estou usando Eclipse com Struts, Hibernate Annotations com hibernate.properties. Teria como mudar meu hibernate.properties dinamicamente?

Abraço a todos…

5 Respostas

romarcio

Nesse seu caso, acho que seria mais apropriado criar a configuração ou parte dela, programaticamente. No objeto configure da SessionFactory você tem acesso a um método setPropeties("","") nelo você coloca a propriedade que quer configurar e o valor dela.

P
public class ConnectDB {  
       
#     private static final SessionFactory sessionFactory;      
#     private static final ThreadLocal<Session> threadLocal = new ThreadLocal<Session>();  
#       
#     static {  
#         try{                    
#   
#             Configuration configuration = new AnnotationConfiguration()  
#             .addAnnotatedClass(br.com.guj.entidades.Usuario.class)  
#             .addAnnotatedClass(br.com.guj.entidades.Moderador.class)  
#             .addAnnotatedClass(br.com.guj.entidades.Administrador.class);  
#               
#             configuration.setProperty("hibernate.connection.url","<SUA URL>");  
#             configuration.setProperty("hibernate.connection.driver_class", "<SEU DRIVER>");  
#             configuration.setProperty("hibernate.connection.username", "< USUARIO DO SGBD>");  
#             configuration.setProperty("hibernate.connection.password","<SENHA DO USUARIO>");  
#             configuration.setProperty("hibernate.dialect","<DIALETO DO SGBD>");  
#               
#             sessionFactory = configuration.buildSessionFactory();  
#   
#         }catch (Throwable t){  
#             throw new ExceptionInInitializerError(t);  
#         }  
#     }  
#       
#     public static Session getInstance(){  
#         Session session = (Session) threadLocal.get();  
#         session = sessionFactory.openSession();  
#         threadLocal.set(session);          
#         return session;  
#     }  
#       
# }
daniellfeijo

romarcio:
Nesse seu caso, acho que seria mais apropriado criar a configuração ou parte dela, programaticamente. No objeto configure da SessionFactory você tem acesso a um método setPropeties("","") nelo você coloca a propriedade que quer configurar e o valor dela.

Romarcio,

Vou tentar seguir o seguinte caminho:

1 - Vou usar uma SessionFactory para cada empresa;
2 - Na tela de Login vai ser passado um parametro que vai definir a SessionFactory que vai ser utilizada nesta HttpSession.

Vou fazer os teste e depois posto aqui o resultado no forum.
daniellfeijo

Senhores,

Como tenho muito carinho por esse forum, e fui muitas vezes ajudado pelo mesmo, me sinto feliz em explicar como resolvi o problema. Não sei se essa minha solução é a melhor, para mim ficou legal, mas vamos lá… Vou me basear num exemplo para duas empresas(Empresa1 e Empresa2). Porém esse exemplo pode ser utilizado para mais de duas empresas.

Primeiro vamos precisar de uma SessionFactory para cada empresa:

Para Empresa1 criei a classe Empresa1DB onde vai configurar e retornar a SessionFactory desta empresa:

...
	
	private static final SessionFactory sessionFactory;        
	private static final ThreadLocal<Session> threadLocal = new ThreadLocal<Session>();    
		
		static {    
			try{
									
		    AnnotationConfiguration configuration = new AnnotationConfiguration();    
	            configuration.addAnnotatedClass(modelo.Usuario.class);    
	            configuration.addAnnotatedClass(modelo.Paciente.class);    
	                
	            //aqui é a unica mudança no meu caso para as SessioFactory pois mudo só onde está o Schema desejado    
		    configuration.setProperty("hibernate.connection.url","jdbc:mysql://localhost/empresa1");    
                    configuration.setProperty("hibernate.connection.driver_class", "com.mysql.jdbc.Driver");    
	            configuration.setProperty("hibernate.connection.username", "root");    
	            configuration.setProperty("hibernate.connection.password","root");    
	            configuration.setProperty("hibernate.dialect","org.hibernate.dialect.MySQLDialect");
	            configuration.setProperty("hibernate.hbm2ddl.auto","update");
	
	            sessionFactory = configuration.buildSessionFactory();    
	
	         }catch (Throwable t){    
	             throw new ExceptionInInitializerError(t);    
	         }    
	     }    
	         
	public static Session getInstance(){    
		Session session = (Session) threadLocal.get();    
		session = sessionFactory.openSession();    
	    threadLocal.set(session);            
	    return session;    
	}
	public static void closeSession(){
		sessionFactory.close();
	}
	public static SessionFactory getSessionFactory(){
		return sessionFactory;
	}

}

A mesma coisa fiz para Empresa2 só mudo a linha onde define o Schema para empresa2:

configuration.setProperty("hibernate.connection.url","jdbc:mysql://localhost/empresa2");

IMPORTANTE: Reparem que criei o método getSessionFactory() que retorna a SessionFactory construída nesta classe!

Agora vou utilizar meu LoginAction para fazer essa “escolha de Base de Dados”!!

Primeiramente na tela de login vou passar uma Strig como parâmetro na minha .jsp para identificar a empresa:

...
<input name="empresa" tabindex="3" maxlength=13 size=13/>
...

Passado a String com o nome da empresa que quero utilizar, a nossa LoginAction vai direcionar tudo:

...
public class LoginAction extends Action{
...
//Criei uma SessionFactory estatica que vai receber a SessionFactory da empresa escolhida
public static SessionFactory sessionFactory;

//recebendo o paremetro da .jsp
bd = request.getParameter("empresa");
System.out.println("Empresa Selecionada: "+bd);

//fazendo a comparação e nossa static sessionFactory vai receber a SessionFactory escolhida
//utilizamos o metodo getSessionFactory() que criamos anteriormente
if (bd.equals("Empresa1")){
		sessionHibernate = Empresa1DB.getInstance();
		sessionFactory = Empresa1DB.getSessionFactory();		
		}
if(bd.equals("Empresa2")){
			sessionHibernate = Empresa2DB.getInstance();
			sessionFactory = Empresa2DB.getSessionFactory();
		}

...

Pronto!!! Agora nossa LoginAction está com a nossa SessionFactory escolhida!!

Agora é só chamar nossa SessionFactory toda vez que for abrir uma sessão, por exemplo:

...
Session sessionHibernate = LoginAction.sessionFactory.openSession();
Transaction transaction = sessionHibernate.beginTransaction();
UsuarioDAO dao = new UsuarioDAO(sessionHibernate);
dao.salva(usuario);
transaction.commit();
sessionHibernate.close();
...

Lembrando que na ação de Logoff ou no filtro de sessão expirada temos que encerrar nossa SessionFactory:

LoginAction.sessionFactory.close();

Não sei se consegui ser claro. Também não sei se essa é a melhor forma. Mas está funcionando e está aí para quem quiser usar.

Qualquer dúvida estou a disposição para ajudar

Abraço a todos!

Tati_Meneghello

Boa tarde galera …

to com um pequeno problema aqui
eu fiz um sistema web em java e fiz um menu na lateral…
com isso qria que qndo eu seleciona-se um item do menu ele aparece no centro q seria a tabela ao lado…

como eu poderia fazer isso

attt

Criado 12 de março de 2011
Ultima resposta 19 de mar. de 2011
Respostas 5
Participantes 4