VRaptor e Generic DAO

4 respostas
epitacio_junior

Pessoal eu tô com um problema enorme com o vraptor pq não consigo usar o Generic DAO.
Na verdade eu consegui, mas quando eu deixei de estaciar o EntityManagerFactory e o EntityManager na Generic DAO e e coloquei o VRaptor pra fazer isso, tudo desandou.

Eu antes tava fazendo assim:
public class GenericDao<T, ID extends Serializable> {

    private static final EntityManagerFactory factory = Persistence.createEntityManagerFactory("modelmmj");
    private EntityManager entityManager = factory.createEntityManager();
    private final Class<T> oClass;

    public GenericDao() {
        this.oClass = (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0];
    }

    protected EntityManager getEntityManager() {
        return entityManager;
    }

    public void salvar(T object) {...}

    public void atualiza(T object) {...}

    public T pesquisaId(ID id) {...}

    public void exclui(T object) {...}

    public List<T> listaTodos() {...}
}

e fazend uma extensão dela para o ProdutoDao:

public class ProdutoDao extends GenericDao<Produto, Long>{}

tava funcionando blz.

So que quando o VRaptor estancia o EntityManager pra mim eu mudei o Generic Dao assim:

@Component                    
public class GenericDao<T, ID extends Serializable> {

    private final EntityManager entityManager;
    private final Class<T> oClass;

    public GenericDao(EntityManager entityManager) {
        this.entityManager = entityManager;
        this.oClass = (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0];
    }

    protected EntityManager getEntityManager() {
        return entityManager;
    }
    
    public void salvar(T object) {...}

    public void atualiza(T object) {...}

    public T pesquisaId(ID id) {...}

    public void exclui(T object) {...}

    public List<T> listaTodos() {...}
}

Ai me gera um problema. Eu não posso colocar um construtor sem argumentos pq dá erro.
Mas o meu ProdutoDao pede um construtor sem argumentos do GenericDao.
Alguem me ajuda.

4 Respostas

Lucas_Cavalcanti

faça isso:

public class ProdutoDao extends GenericDao<Produto, Long>{
     public ProdutoDao(EntityManager entityManager) {  
        super(entityManager);  
     }
}

o Ctrl+1 do eclipse já te sugere isso

o GenericDao não tem que ser um @Component, o ProdutoDAo sim

epitacio_junior

Valeu Lucas,
ficou funcional.

Obrigado.

robertouba

Mesmo utilizando diretamente Session, precisariamos criar um dao para cada uma das classes?

Lucas_Cavalcanti

o ideal é não usar a session direto nos controllers… o dao é justamente pra isolar essa parte

Criado 28 de dezembro de 2010
Ultima resposta 13 de jun. de 2011
Respostas 4
Participantes 3