HibernateUtil

10 respostas
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

10 Respostas

M

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();
	}
}
jximenes

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

M

vlw precisa tamo ai

bronx

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

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:

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! ^^

jximenes

bronx:
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

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:

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

W
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!!
bronx
wesllhey:
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!!

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...!!

jximenes
bronx:
wesllhey:
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!!

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...!!

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

VandersonAssis

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! ^^


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?

Criado 21 de dezembro de 2011
Ultima resposta 23 de nov. de 2012
Respostas 10
Participantes 5