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
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
[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…!
[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…! [/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();
[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();
//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();
//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?