Dúvida com classes Dao e Dao Genérica.... Urgente

3 respostas
V

Olá, pessoal!!

Estou implementando utilizando Dao e annotations e stou com uma dúvida ...

Tenho a classe DaoFactory:

public class DaoFactory {

    private final Session session;
    private Transaction transaction;

    public DaoFactory() {
        session = HibernateUtil.getSession();
    }
    public void beginTransaction() {
        this.transaction = this.session.beginTransaction();
    }
    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 AcessoDao getAcessoDao() {
        return new AcessoDao(this.session);
    }      
}

Tenho a Classe Dao genérica:

public class Dao<T> {
    
    private final Session session;
    private final Class classe;

    Dao(Session session, Class classe) {
        this.session = session;
        this.classe = classe;
    }

    protected Session getSession(){
        return session;
    }
    
    public void adiciona(T u) {
        this.session.save(u);
    }
    public List<T> listaTudo() {
        return this.session.createCriteria(this.classe).list();    
    }    
}

e a classe AcessoDao, que estende a classe Dao para tratar as questões referentes a controle de acesso dos usuarios na aplicação:

public class AcessoDao extends Dao<Usuario> {

    AcessoDao(Session session) {
      super(session, Usuario.class);
    }    
    
    public void conectar() {        
          .....
    } 

    public void desconectar() {        
          .....
    } 

    public void verificarLog() {        
           .....
    } 

    public void consulta() {        
          .....
    } 
 }

A dúvida é a seguinte: Caso eu queira fazer com que a classe AcessoDao seja "genérica" em relação a outras classes, e implementar uma classe ainda mais específica, que estenda AcessoDao, o que eu preciso alterar em AcessoDao? Preciso fazer a alteração na classe DaoFactory também ?

[size="11"][color="red"]* Editado: Lembre-se de utilizar BBCode em seus códigos - Carneiro[/color][/size] :joia:

3 Respostas

L

Você pode seguir essa estrutura:

Interface Dao (com os métodos de todos Dao’s)

interface Dao<T> {
		void adiciona(T t);
		
		void remove(T t);
		
		List<T> listaTudo();
		
		//blablabla outros métodos de Dao
	}

Dao Generico (implementação dos métodos genéricos… )

class GenericDao<T> implements Dao<T> {

		public void adiciona(T t) {
			//implementação
		}

		public List<T> listaTudo() {
			//implementação
			return null;
		}

		public void remove(T t) {
			//implementação
		}
	}

Interface AcessoDao (contém os métodos especificos de Acesso, mas ela ainda assim é um Dao)

interface AcessoDao extends Dao<Usuario> {
		void conectar();
		
		//blablabla outros métodos especificos de AcessoDao
	}

Implementação do Dao de acessos (extende o generico e implementa a interface dele)

class AcessoDaoImpl extends GenericDao<Usuario> implements AcessoDao {

		public void conectar() {
			//implementação
			
		}
		
	}
V

Muito obrigada pela dica … Vou tentar seguir esta estrutura …

Obs: Eu tentei fazer alguma coisa, mas como não deu certo, achei que se postasse do jeito que não funcionou, complicaria mais para quem fosse ler …

Obrigada !

F

ola vclaporti

no site do urubatan tem um dao generico bem completo parecido com o do luBS
blog urubatan

vale a pena conferir

Criado 12 de julho de 2007
Ultima resposta 13 de jul. de 2007
Respostas 3
Participantes 3