HibernateUtil

Alguem sabe porque o metodo addAnnotedClass nao esta aceitando o meu argumento? E quando eu altero o argumento para Produto.class, a classe funciona normalmente.

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

public class HibernateUtil<T> {
	
	private static SessionFactory factory;
	private static Class classePersistente;
	
	public HibernateUtil(T t){
		
		classePersistente=t.getClass();
		
	}
		
	static{
		
		AnnotationConfiguration cfg = new AnnotationConfiguration();
		cfg.addAnnotatedClass(classePersistente);
		
		factory = cfg.buildSessionFactory();
				
	}
	

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

}

Erro

Exception in thread "main" java.lang.ExceptionInInitializerError
	at br.com.jp.hibernate.TestaDaoGenerico.main(TestaDaoGenerico.java:12)
Caused by: java.lang.NullPointerException
	at org.hibernate.cfg.AnnotationConfiguration.secondPassCompile(AnnotationConfiguration.java:263)
	at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1333)
	at org.hibernate.cfg.AnnotationConfiguration.buildSessionFactory(AnnotationConfiguration.java:867)
	at br.com.jp.hibernate.HibernateUtil.<clinit>(HibernateUtil.java:24)
	... 1 more

pq nao faz assim



package br.com.projeto.util;

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

import br.com.projeto.beans.Funcionario;
import br.com.projeto.beans.ItensDeProduto;
import br.com.projeto.beans.ItensDeServico;
import br.com.projeto.beans.OrdemDeServico;
import br.com.projeto.beans.Pessoa;
import br.com.projeto.beans.Produto;
import br.com.projeto.beans.Telefones;
import br.com.projeto.beans.TipoDeServico;

public class HibernateUtil {

	private static SessionFactory sF;

	private HibernateUtil() {

	}

	public static SessionFactory getSf() {

		if (sF == null) {
			try {
				AnnotationConfiguration cfg = new AnnotationConfiguration();
				
				 cfg.addAnnotatedClass(Telefones.class);
				 cfg.addAnnotatedClass(Funcionario.class);
				 cfg.addAnnotatedClass(ItensDeProduto.class);
				 cfg.addAnnotatedClass(ItensDeServico.class);
				 cfg.addAnnotatedClass(TipoDeServico.class);
				 cfg.addAnnotatedClass(Produto.class);
				 cfg.addAnnotatedClass(Pessoa.class);
				 cfg.addAnnotatedClass(OrdemDeServico.class);			
				
				sF = cfg.configure().buildSessionFactory();

			} catch (Throwable ex) {
				System.err.println("Initial SessionFactory creation failed  " + ex);
				throw new ExceptionInInitializerError(ex);
			}

			return sF;

		} else {

			return sF;
			
		}

	}

	public static void main(String[] args) {
		HibernateUtil.getSf();
	}
}

Legal!! assim deu certo… é que eu estava tentando receber uma classe qualquer por parametro e passar ela no metodo… mas nao tava dando certo
Muito obrigado pela ajuda… abraço

vlw precisa tamo ai

[quote=jximenes]Alguem sabe porque o metodo addAnnotedClass nao esta aceitando o meu argumento? E quando eu altero o argumento para Produto.class, a classe funciona normalmente.

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

public class HibernateUtil<T> {
	
	private static SessionFactory factory;
	private static Class classePersistente;
	
	public HibernateUtil(T t){
		
		classePersistente=t.getClass();
		
	}
		
	static{
		
		AnnotationConfiguration cfg = new AnnotationConfiguration();
		cfg.addAnnotatedClass(classePersistente);
		
		factory = cfg.buildSessionFactory();
				
	}
	

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

}

Erro

Exception in thread "main" java.lang.ExceptionInInitializerError at br.com.jp.hibernate.TestaDaoGenerico.main(TestaDaoGenerico.java:12) Caused by: java.lang.NullPointerException at org.hibernate.cfg.AnnotationConfiguration.secondPassCompile(AnnotationConfiguration.java:263) at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1333) at org.hibernate.cfg.AnnotationConfiguration.buildSessionFactory(AnnotationConfiguration.java:867) at br.com.jp.hibernate.HibernateUtil.<clinit>(HibernateUtil.java:24) ... 1 more [/quote]

Prezados,

Lembrem-se: blocos estáticos

static { //... } são executados pela JVM no momento em que ela carrega a classe. Ou seja, este bloco é executado antes mesmo de se executar o construtor da classe!

Consequentemente, como o atributo classePersistente só é inicializado no construtor, no momento da execução do bloco estático o atributo encontra-se NULO.
Isso acabou gerando o nosso querido NullPointerException…! :smiley: :smiley:

Você pode utilizar blocos sem a cláusula static:

{
    System.out.println("Um bloco qualquer...");
}

O bloco acima é “anexado” aos construtores. Ou seja, a JVM executa o construtor, e depois o bloco! ^^

[quote=bronx][quote=jximenes]Alguem sabe porque o metodo addAnnotedClass nao esta aceitando o meu argumento? E quando eu altero o argumento para Produto.class, a classe funciona normalmente.

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

public class HibernateUtil<T> {
	
	private static SessionFactory factory;
	private static Class classePersistente;
	
	public HibernateUtil(T t){
		
		classePersistente=t.getClass();
		
	}
		
	static{
		
		AnnotationConfiguration cfg = new AnnotationConfiguration();
		cfg.addAnnotatedClass(classePersistente);
		
		factory = cfg.buildSessionFactory();
				
	}
	

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

}

Erro

Exception in thread "main" java.lang.ExceptionInInitializerError at br.com.jp.hibernate.TestaDaoGenerico.main(TestaDaoGenerico.java:12) Caused by: java.lang.NullPointerException at org.hibernate.cfg.AnnotationConfiguration.secondPassCompile(AnnotationConfiguration.java:263) at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1333) at org.hibernate.cfg.AnnotationConfiguration.buildSessionFactory(AnnotationConfiguration.java:867) at br.com.jp.hibernate.HibernateUtil.<clinit>(HibernateUtil.java:24) ... 1 more [/quote]

Prezados,

Lembrem-se: blocos estáticos

static { //... } são executados pela JVM no momento em que ela carrega a classe. Ou seja, este bloco é executado antes mesmo de se executar o construtor da classe!

Consequentemente, como o atributo classePersistente só é inicializado no construtor, no momento da execução do bloco estático o atributo encontra-se NULO.
Isso acabou gerando o nosso querido NullPointerException…! :smiley: :smiley: [/quote]

Muito bom… nao estava me atentando a esse detalhe!!..vlw amigo

[code] public static Session getSession() {
AnnotationConfiguration a = new AnnotationConfiguration();
a.addAnnotatedClass(SuaClasse.class);// aqui deve ficar sa classe tipo se for Pessoa a.addAnnotatedClass(Pessoa.class);
a.configure();

	SessionFactory factory = a.buildSessionFactory();
	Session session = factory.openSession();
	return session;
}

//desse modo sua util n irá fica amarrada e vai ser disponibilizada ao acesso facil facil!!
[/code]

[quote=wesllhey][code] public static Session getSession() {
AnnotationConfiguration a = new AnnotationConfiguration();
a.addAnnotatedClass(SuaClasse.class);// aqui deve ficar sa classe tipo se for Pessoa a.addAnnotatedClass(Pessoa.class);
a.configure();

	SessionFactory factory = a.buildSessionFactory();
	Session session = factory.openSession();
	return session;
}

//desse modo sua util n irá fica amarrada e vai ser disponibilizada ao acesso facil facil!!
[/code][/quote]

E ae brother!

Cara, essa abordagem é totalmente não recomendada em ambiente de produção (na real, nem de testes nem em nada…rs).

Da maneira como você colocou, é necessario que se crie uma SessionFactory toda vez que se necessitar de uma Session.

Tenham em mente que SessionFactories são objetos caros, sua instanciação é uma operação custosa para o sistema.
Imaginando um sistema com milhares de acessos, criar SessionFactories para cada request certamente vai reduzir MUITO o desempenho (tempo de resposta) da sua aplicação.

O ideal é ter apenas uma SessionFactory em todo o ciclo de vida da aplicação (criada no start da mesma), e utilizá-la para criar as demais Sessions que forem requisitadas…!!

[quote=bronx][quote=wesllhey][code] public static Session getSession() {
AnnotationConfiguration a = new AnnotationConfiguration();
a.addAnnotatedClass(SuaClasse.class);// aqui deve ficar sa classe tipo se for Pessoa a.addAnnotatedClass(Pessoa.class);
a.configure();

	SessionFactory factory = a.buildSessionFactory();
	Session session = factory.openSession();
	return session;
}

//desse modo sua util n irá fica amarrada e vai ser disponibilizada ao acesso facil facil!!
[/code][/quote]

E ae brother!

Cara, essa abordagem é totalmente não recomendada em ambiente de produção (na real, nem de testes nem em nada…rs).

Da maneira como você colocou, é necessario que se crie uma SessionFactory toda vez que se necessitar de uma Session.

Tenham em mente que SessionFactories são objetos caros, sua instanciação é uma operação custosa para o sistema.
Imaginando um sistema com milhares de acessos, criar SessionFactories para cada request certamente vai reduzir MUITO o desempenho (tempo de resposta) da sua aplicação.

O ideal é ter apenas uma SessionFactory em todo o ciclo de vida da aplicação (criada no start da mesma), e utilizá-la para criar as demais Sessions que forem requisitadas…!![/quote]

O ideal seria colocar esse metodo getSession em um bloco static?

[quote=bronx]Você pode utilizar blocos sem a cláusula static:

{
    System.out.println("Um bloco qualquer...");
}

O bloco acima é “anexado” aos construtores. Ou seja, a JVM executa o construtor, e depois o bloco! ^^[/quote]
Desculpa trazer o tópico de volta a vida. Mas não achei o motivo de se usar um bloco sem assinatura como o acima. Se ele é anexado ao construtor e executado após a execução do mesmo, porque não coloca-lo dentro do próprio construtor embaixo de tudo a favor da legibilidade?