Generics

5 respostas
G

Olá,

Estou tentanto criar uma classes DAO generica utilizando Generics, só q não estou sabendo como utilizar o .class. O código é o seguinte

package br.com.quadra4.rush.dao.geral;

import br.com.quadra4.rush.dao.util.HibernateUtil;
import java.util.*;
import org.hibernate.Session;
import org.hibernate.Query;
import org.apache.log4j.Logger;

public class BaseDAO<X> {
    public BaseDAO() {}
    
    public X buscarPorCodigo(Long codigo) {
        X x = null;

        try {
          Session session = HibernateUtil.getCurrentSession();
          HibernateUtil.beginTransaction();
          x = (X) session.load(X.class, codigo);
          HibernateUtil.commitTransaction();
        }
        catch (Exception e) {
          HibernateUtil.rollbackTransaction();
        }
        finally {
          HibernateUtil.closeSession();
        }
        return x;
    }
    
}

o problema é na linha 18 ( 'x = (X) session.load(X.class, codigo);' ). Não consiguo fazer X.class. Como posso fazer isso no Generics.

Anderson

5 Respostas

J
x = (X) session.load(x.getClass(), codigo);
G

mas x é null… Se eu fizer um x.getClass(), vou ter uma Exception

Anderson

J

Ahh tá, não tinha visto… nesse caso, acho que nao tem como!

R

Você vai ter que utilizar reflection para saber de qual classe é o Generics do seu DAO.

Acho que o código é esse:

this.getClass().getTypeParameters()[0].getBounds()[0];

Com esse código vc sabe qual é a classe que seu DAO utiliza

vc tem usar o generics assim:

GenericDAO<X>

PessoaDAO extends GenericDAO<Pessoa>


se vc utilizar assim:

GenericDAO<X>

PessoaDAO<X extends Pessoa> extends GenericDAO<X>

o código do reflection vai ser outro.

Reflection com generics é uma coisa meio complexa, mas vai tentando aí que vc consegue[/code]

F

Cara, primeiro transforma essa classe ai em abstract e
troca o X por T, eh mais ‘padrao’…

Depois faz assim, cria uma propriedade

protected Class persistentClass;

Entao, quem estender essa tua BaseDao, coloca ali a classe de persistencia,
tipo,

class UserDao extends BaseDao<User> {
    public UserDao() {
         this.persistentClass = User.class;
    }
}
Criado 22 de maio de 2006
Ultima resposta 26 de mai. de 2006
Respostas 5
Participantes 4