DAOFactory Genérico

Olá,

Estou começando a aprender um pouco sobre Hibernate, e montei uma classe DAOFactory utilizando generics, procurando fazer algo o mais genérico possível. Este tipo de implementação é bom? A performance da aplicação cai muito com esta abordagem? O que vocês acham?

package com.checklist.dao;

import java.util.List;

import org.hibernate.Session;
import org.hibernate.Transaction;

import com.checklist.util.HibernateUtil;

public class DAOFactory<T> {

	private final Session session;

	private Transaction transaction;

	private Class<T> classe;
	
	@SuppressWarnings("unchecked")
	public DAOFactory(T u) {
		session = HibernateUtil.getSession();
		this.classe = (Class<T>) u.getClass();
	}

	public void beginTransaction() {
		this.transaction = this.session.beginTransaction();
	}

	private void save(T u) {
		this.session.save(u);
	}

	public void commit() {
		this.transaction.commit();
		this.transaction = null;
	}

	public boolean hasTransaction() {
		return this.transaction != null;
	}

	public void rollback() {
		this.transaction.rollback();
		this.transaction = null;
	}

	public void close() {
		this.session.close();
	}

	public DAOFactory<T> getGenericDAO() {
		try {
			return new DAOFactory<T>(this.classe.newInstance());
		} catch (InstantiationException e) {
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			e.printStackTrace();
		}
		return null;
	}

	public void adiciona(T u) {
		beginTransaction();
		save(u);
		commit();
	}

	public void remove(T u) {
		this.session.delete(u);
	}

	public void atualiza(T u) {
		this.session.merge(u);
	}

	@SuppressWarnings("unchecked")
	public List<T> listaTudo() {
		return this.session.createCriteria(this.classe).list();
	}

	@SuppressWarnings("unchecked")
	public T procura(Long id) {
		return (T) session.load(this.classe, id);
	}
}

Bem… se é o começo, o caminho tá certo… com exceção do conceito, rs…
Factory e DAOs (que é o que vc está fazendo) são conceitos diferentes e necessitam de nomeação corretas… procure um pouco mais sobre Factories e DAO e vc vai perceber a diferença…
Na verdade vc tentou uma coisa com um nome diferente… rs…
Vc tentou um DAO Generico e nomeou como DAOFActory… DAOFactory seria, por exemplo uma classe que controe e retorna instancias de classes que podem implementar essa sua ai, só que com um nome correto…

Padrões de projeto estão diretamente ligados a uma nomeação correta das coisas, para que uma outra pessoa, ao bater o olho, consiga saber o que a classe se propôe a fazer, sacou?

Procure dar uma olhada nestes links…

http://www.urubatan.com.br/dao-generico-um-exemplo-a-pedidos/

[]'s

Oi,

http://www.hibernate.org/328.html

dá uma lida…sobre DAO com Hibernate esse assunto é polêmico…muita gente vai achar que não precisa, logo vai criar uma abstração desnecessária gerando maior complexidade sem necessidade.

Em minha opinião, quando se tem em mente reutilização ou generalização, comece criando as coisas para uma interface e não para uma implementação concreta…
Logo, crie uma InterfaceDAO e declare os métodos de CRUD que serão comum às suas classes…
Cria uma classe que implemente essa interface e construa tais métodos…
Neste ponto vc terá um DAO que de certa forma fará o básico i [/i]para todas as suas classes…
E quando houverem situações mais específicas, vc extende esse DAO criado e cria os métodos necessários!

[]'s