Erro passando classe como parametro

10 respostas
VandersonAssis

Caras, estou com um problema a dois dias sem sair do lugar!

Tenho uma classe chamada HibernateUtil a qual irá distribuir sessions. Essa HibernateUtil receberá no construtor a classe do hibernate para qual ela precisará criar uma session. Eu estou tentando fazer ela genérica o suficiente para receber qualquer tipo de classe no construtor, criar a sessão e devolver. Só que não está funfando!
La na parte onde eu chamo o método addAnnotatedClass do AnnotationConfiguration da erro! Tipo … nele o certo seria colocar o nome da classe do hibernate.class. Só que esse Objeto que vem no parametro não tem o método .class só tem o getClass. Que passa pelo compilador, mas quando é executado no sistema web da erro de null pointer.

Desculpa pelo textão ai pessoas, mas teriam vocês alguma dica pra eu resolver essa parada?

Thanks in advance!

package br.com.van.hibernate.util;

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

public class HibernateUtil {

	private static SessionFactory factory;
	private static Object classe;
	
	public HibernateUtil(Object nomeClasse){
            classe = nomeClasse;
	}  

	static{
		
		AnnotationConfiguration cfg = new AnnotationConfiguration();
                //Nesse addAnnotatedClass eu deveria colocar a classe do hibernate.class como parametro. Mas o objeto não tem ".class!"
		cfg.addAnnotatedClass(classe.getClass());
		factory = cfg.buildSessionFactory();

	}
	
	public Session getSession(){
		return factory.openSession();
	}

}

10 Respostas

WRYEL

Que tal um construtor de varArgs? :slight_smile: ex:

public class Build {
		
		public Build(Class<?> requiredClass /* obriga pelo menos uma classe */, Class<?>...classes /*quantidade qquer opcional*/) {
			System.out.println(requiredClass.getName());
			for (Class<?> klass : classes) {
				System.out.println(klass.getName());
			}
		}
	}

Build build = new Build(Object.class, String.class, Math.class);

edit: seu código tem gambiarra rs, ta dando nullpointer porquê quando você aponta no seu codigo HibernateUtil, a jvm executa o bloco que está como static antes (apenas na primeira vez que a classe é carregado pela jvm) do hibernateUtil ser instanciado.

VandersonAssis

WRYEL:
Que tal um construtor de varArgs? :slight_smile: ex:

public class Build {
		
		public Build(Class<?> requiredClass /* obriga pelo menos uma classe */, Class<?>...classes /*quantidade qquer opcional*/) {
			System.out.println(requiredClass.getName());
			for (Class<?> klass : classes) {
				System.out.println(klass.getName());
			}
		}
	}

Build build = new Build(Object.class, String.class, Math.class);

edit: seu código tem gambiarra rs, ta dando nullpointer porquê quando você aponta no seu codigo HibernateUtil, a jvm executa o bloco que está como static antes (apenas na primeira vez que a classe é carregado pela jvm) do hibernateUtil ser instanciado.

Puts o codigo está bugado então =/ eu achei que a JVM executava o construtor antes do bloco static. Tem certeza que ela executa o static antes do construtor?

VandersonAssis

Pessoal, eu ví pela net que algumas pessoas colocam a session do hibernate em um filter.
Mas como faço isso? Eu tentei aqui mas não deu. Alguma idéia?

VandersonAssis

Ninguém =/

Rodrigo_Sasaki

está falando de OpenSessionInView?

Por que você precisa de um bloco static? Não pode usar um método estático pra fazer o que quer?

VandersonAssis

Então cara, eu ví bastante coisa sobre abrir session na view. Mas acho isso muito estranho =/ Isso não seria nenhum tipo de gambiarra?
Eu queria pode abrir essa session em um filter no lado servidor mesmo. Tem alguma maneira?

Estou usando JBoss, JSF e Hibernate.

Rodrigo_Sasaki

Mas o filtro não é de requisições?

Cara, acho melhor você explicar o seu cenário, dizer o que está acontecendo, em que pé está, o que você quer que aconteça e o que está te impedindo. Assim o pessoal consegue ver o problema real e sugerir soluções viáveis pra você.

VandersonAssis

Ta, vamos lá.

Antes eu tinha:
Uma classe hibernateUtil que cria as sessions, passa para o dao carregar alguma lista de ítens no BD e a view carrega essa lista no dataTable do JSF.
Dessa forma a lista era carregada, aparentemente sem problemas. Mas quando fui checar no banco. O hibernate estava fazendo uma quantidade gigantesca de selects para carregar essa lista. Ele fazia um select/conexão no banco para cada ítem! E eu mesmo eu colocando o “session.close();” no hibernateUtil a conexão continuava aberta no banco.

Agora eu tenho(Estou tentando ter):
Um tipo de um filter que no método doFilter crie a session e “pendure a mesma” na request do usuário, e repasse para frente usando o chain.doFilter(req, res). E depois que tudo fosse executado o método “destroy” do filter iria dar o “session.close();”. Só que não está funcionando porque quando passo o parametro (req, res) no managedBean ele gera uma exceção na página porque a assinatura do método do managedBean deve ser vazia. E nesse caso não está sendo vazia porque estou tentando passar os parametros no método. Entendes?

OBS: Não sei se essa é uma boa abordagem para meu problema. Na verdade nem sei se dá para fazer isso.

Gostaria que me dessem alguma outra solução que não fosse criar a session na view. Pois acho isso meio estranho, mas se for a melhor abordagem, beleza. Farei!

Está aí, tudo nesse textão =) ME AJUDEM!

Rodrigo_Sasaki

Teve uma discussão bem bacana sobre OpenSessionInView aqui no GUJ, falando de desvantagens e cuidados a serem tomados ao utilizá-lo, vale a pena ler.

Link: http://www.guj.com.br/java/231652-alguem-usa-algum-padrao-diferente-de-open-session-in-view-ao-trabalhar-com-jpa

VandersonAssis

digaoneves:
Teve uma discussão bem bacana sobre OpenSessionInView aqui no GUJ, falando de desvantagens e cuidados a serem tomados ao utilizá-lo, vale a pena ler.

Link: http://www.guj.com.br/java/231652-alguem-usa-algum-padrao-diferente-de-open-session-in-view-ao-trabalhar-com-jpa


Vou ler!

Criado 30 de maio de 2012
Ultima resposta 1 de jun. de 2012
Respostas 10
Participantes 3