[RESOLVIDO] [HIBERNATE] Generic DAO

8 respostas
E

Boa tarde a todos.

Estou criando uma DAO genérico utilizando o Hibernate 4.1

Gostaria de saber como eu posso criar uma busca em cima de um Objeto, que eu chamei de findByExample (Não estou usando Spring).

[HibernateUtil]

public class HibernateUtil {
	private static SessionFactory sessionFactory;
	
	//COnfigura um objeto do tipo SessionFactory que irá prover todos os objetos de Sessão (Session)
	public SessionFactory setUp(){
		return new Configuration().configure().buildSessionFactory();		
	}
	
	//Obtem a SessionFactory
	public SessionFactory getSessionFactory(){
		return this.sessionFactory = setUp();
	}
}

[AbstractDAO]

public abstract class AbstractDAO<T> {
	private Class classe;
	private Session session;
	
	public AbstractDAO(){
		this.classe = (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0];
		setSession(new HibernateUtil().getSessionFactory());
	}
	
	public void setSession(SessionFactory sf){
		this.session = sf.openSession();
	}
	
	public void save(T t){
		this.session.beginTransaction();
		this.session.save(t);
		this.session.close();
	}
	
	public void delete(T t){
		this.session.beginTransaction();
		this.session.delete(t);
		this.session.close();
	}
	
	public void alter(T t){
		this.session.beginTransaction();
		this.session.update(t);
		this.session.close();
	}
	
	public List<T> findAll(T t){
		this.session.beginTransaction();
		return this.session.createCriteria(this.classe).list();
	}
	

        //Como implementar esta busca?
	public List<T> findByExample(T t){
		this.session.beginTransaction();
		
	}
}

Agradeço as respostas.

8 Respostas

R
private Class classe;

public List&lt;T&gt; findByExample() throws Exception {
        return session.createCriteria(classe).list();
}
E
romarcio:
private Class classe;

public List&lt;T&gt; findByExample() throws Exception {
        return session.createCriteria(classe).list();
}

Uma dúvida que gerou agora, se reparar no meu método findAll eu não implementei o this.session.close(). Isto pode gerar algum problema mais grave?

Obrigado pela resposta.

F

Primeiramente, você não precisa abrir uma transação em consultas. Em segundo lugar você só precisa de uma instância de sessionFactory.

public class HibernateUtil {
	private static final SessionFactory sessionFactory;
	
	//COnfigura um objeto do tipo SessionFactory que irá prover todos os objetos de Sessão (Session)
	static {
		this.sessionFactory = new Configuration().configure().buildSessionFactory();		
	}
	
	//Obtem a Session
	public static Session getSession(){
		return this.sessionFactory.openSession();
	}
}
public abstract class AbstractDAO<T> {
	private Class classe;
	private Session session;
	
	public AbstractDAO(){
		this.classe = (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0];
	}
	
	protected Session getSession(){
		if(this.session == null || !this.session.isOpen()){
			this.session = HibernateUtil.getSession();
		}
		return this.session;
	}
	
	public void save(T t){
		getSession().beginTransaction();
		getSession().save(t);
		getSession().close();
	}
	
	public void delete(T t){
		getSession().beginTransaction();
		getSession().delete(t);
		getSession().close();
	}
	
	public void alter(T t){
		getSession().beginTransaction();
		getSession().update(t);
		getSession().close();
	}
	
	public List<T> findAll(T t){
		return getSession().createCriteria(this.classe).list();
	}
	
         /**
	 * Metodo responsavel por recuperar todos os objetos de uma tabela da base de dados de acordo
	 * com o exemplo passado.
	 *
	 * @param filtro
	 * @param matchMode
	 * @param ignoreCase
	 * @return lista
	 */
	public List<T> findByExample(T filtro, MatchMode matchMode, boolean ignoreCase){
		org.hibernate.criterion.Example example = org.hibernate.criterion.Example.create(filtro);

		if(matchMode != null){
			example = example.enableLike(matchMode);
		}

		if(ignoreCase){
			example = example.ignoreCase();
		}

		return getSession().createCriteria(this.classe).add(example).list();
	}
}
E

Entendi.

Agora uma dúvida aqui quanto ao Reflection.

Minha classe está em um pacote, quando eu pego ela no GenericDAO ele me traz o nome completo, incluindo o pacote onde ela está.

Como reverter isto e pegar apenas a classe, sem seu caminho?

F

edu_fernandes:
Entendi.

Agora uma dúvida aqui quanto ao Reflection.

Minha classe está em um pacote, quando eu pego ela no GenericDAO ele me traz o nome completo, incluindo o pacote onde ela está.

Como reverter isto e pegar apenas a classe, sem seu caminho?

Como assim cara, não entendi o que você esta fazendo e pq? como assim pegando a classe no genericDao? Coloca o código ai…

E

Ao pegar o classe ele me traz o pacote junto.

Ex.:

package teste

public class MinhaClasse

No AbstractDAO, quando vou realizar uma busca, o SQL está dando erro pois ele está trazendo teste.MinhaClasse e atribuindo a minha Class classe

W

o método é Class.getSimpleName(). Cuidado com métodos de busca genérico, tenha em mente os limites que você quer, senão, você dará milhões de voltas, e não chegará onde se deseja =p

E

É exatamente isto.

Muito obrigado.

Criado 18 de maio de 2012
Ultima resposta 18 de mai. de 2012
Respostas 8
Participantes 4