Pequena Dúvida com AnnotationConfiguration [Hibernate] [Resolvido]

4 respostas
Jhonny_Oliveira

Olá pessoal,

Fiz o curso FJ-21 da Caelum há poucos meses, mas relendo o material surgiu uma dúvida nova.

Tenho a seguinda classe para criar a Session e usá-la no objeto Produto que criei:

public class HibernateUtil {
	private static SessionFactory factory;
	static {
		AnnotationConfiguration cfg= new AnnotationConfiguration();
		cfg.addAnnotatedClass(Produto.class);
		factory = cfg.buildSessionFactory();
	}
	public SessiongetSession(){
		return factory.openSession();
	}
}

Como eu poderia fazer com que essa classe seja utilizada por qualquer objeto com a anotação @Entity ?

Busquei na net, mas nada muito claro de como fazer isso. Desde já agradeço a todos.

4 Respostas

zoren

Automaticamente não é possível.

Mas você pode criar um método que procure todas as classes anotadas com @Entity e assim adicionar na configuração do hibernate

Jhonny_Oliveira

Olá Zoren.

Valeu cara, mas acho que encontrei uma saída. Talvez não seja a mais elegante no entanto funciona muito bem, usuei o getClass() para suprir a minha necessidade de fazer a função ser utilizada por classe com anotação @Entity do meu programa.

package br.com.jhonnyoliveira.protocolo.persistencia;

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

public class HibernateUtil {
	private static SessionFactory factory;
	private Object classe;

	public HibernateUtil(Object classe) {
		this.classe = classe;
		AnnotationConfiguration cfg = new AnnotationConfiguration();
		cfg.addAnnotatedClass(classe.getClass());
		factory = cfg.buildSessionFactory();
	}
	
	
	public Session getSession(){
		return factory.openSession();
	}
}

Com isso eu pude utilizar a mesma HibernateUtil() em mais de um tipo de objeto:

package br.com.jhonnyoliveira.protocolo.teste;

import org.hibernate.Session;

import br.com.jhonnyoliveira.protocolo.modelo.Depto;
import br.com.jhonnyoliveira.protocolo.persistencia.DeptoDao;
import br.com.jhonnyoliveira.protocolo.persistencia.HibernateUtil;

public class TesteDeptoDao {
	
	public static void main(String[] args) {
		
		Depto depto = new Depto();
		Session session = new HibernateUtil(depto).getSession();
		DeptoDao dao = new DeptoDao(session);
		
		depto.setDeptoDesc("Armário");
		
		session.beginTransaction();
		dao.salva(depto);
		session.save(depto);
		session.getTransaction().commit();
		session.close();
		
		
	}
}

e também em:

package br.com.jhonnyoliveira.protocolo.teste;

import org.hibernate.Session;

import br.com.jhonnyoliveira.protocolo.modelo.Usuario;
import br.com.jhonnyoliveira.protocolo.persistencia.HibernateUtil;
import br.com.jhonnyoliveira.protocolo.persistencia.UsuarioDao;

public class testeUsuarioDao {
	public static void main(String[] args) {
		
		Usuario usuario = new Usuario();
		Session session = new HibernateUtil(usuario).getSession();

		UsuarioDao dao = new UsuarioDao(session);

		usuario.setUsuNome("Jhonny Freire Olivera");
		usuario.setUsuLogin("jhonny");
		usuario.setUsuSenha("senha");
		usuario.setUsuDepto(1);

		session.beginTransaction();
		dao.salva(usuario);
		session.save(usuario);
		session.getTransaction().commit();
		System.out.println("ID do Usuario " + usuario.getUsuId());

		session.close();
	}
}

Valeu Zoren!

zoren

Então cara, essa sua solução não funciona não

Cada SessionFactory tem uma série de entidades mapeadas

Desse jeito que você fez, você só poderá utilizar apenas uma entidade, se vc tiver uma consulta que use mais de uma entidade, o seu select irá falhar, pois só tem uma entidade mapeada.

Existe uma biblioteca brasileira chamada Trugger, ela tem uma classe que consegue procurar certas classes no seu classpath e te devolve um list com esses dados.

Jhonny_Oliveira

Olá Pessoal,

Com a ajuda do David Paniz professor da Caelum, a solução para este problema é o seguinte:

public class HibernateUtil {

       private static SessionFactory factory;

       static {

               AnnotationConfiguration cfg = new AnnotationConfiguration();
               cfg.addAnnotatedClass(Produto.class);
               cfg.addAnnotatedClass(Cliente.class);
               cfg.addAnnotatedClass(Bla.class);
               cfg.addAnnotatedClass(OutraClasse.class);
               cfg.addAnnotatedClass(Etc.class);
               factory = cfg.buildSessionFactory();
       }

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

Valeu pela força Zoren

Criado 28 de setembro de 2010
Ultima resposta 11 de out. de 2010
Respostas 4
Participantes 2