DAOFactory Genérico

4 respostas
D

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

4 Respostas

rodrigoallemand

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?

fpavao

Procure dar uma olhada nestes links…

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

[]'s

rafaelglauber

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.

Rodrigo_Rocha_de_Mor

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

Criado 17 de setembro de 2008
Ultima resposta 17 de set. de 2008
Respostas 4
Participantes 5