Galera,
estou reescrevendo uma aplicação minha feita em Java e neste momento estou com uma dúvida na implementação de DAO. O que preciso basicamente é obter o nome da classe a partir de generics. Já tenho a solução, porém gostaria de saber se não há alguma outra forma (melhor) de resolver o mesmo problema. Observem o código a seguir:
package com.neosoft.neoproject.dao.jpa;
import java.lang.reflect.ParameterizedType;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import com.neosoft.neoproject.dao.GenericDao;
import com.neosoft.neoproject.exception.dao.DaoCreateException;
import com.neosoft.neoproject.exception.dao.DaoDeleteException;
import com.neosoft.neoproject.exception.dao.DaoFindException;
import com.neosoft.neoproject.exception.dao.DaoUpdateException;
public class AbstractDaoJpa<Model> implements GenericDao<Model> {
@PersistenceContext
public EntityManager entityManager;
@Override
public void create(Model model) throws DaoCreateException {
entityManager.persist(model);
}
@Override
public void delete(Model model) throws DaoDeleteException {
entityManager.remove(model);
}
@Override
public void update(Model model) throws DaoUpdateException {
entityManager.merge(model);
}
@SuppressWarnings("unchecked")
@Override
public List<Model> findAll() throws DaoFindException {
return entityManager.createQuery("select o from " + getDaoClass().getSimpleName() + " o").getResultList();
}
@Override
public List<Model> findAllByFieldValue(String field, String fieldValue) throws DaoFindException {
return null;
}
@Override
public Model findByFieldValue(String field, String fieldValue) throws DaoFindException {
return null;
}
@Override
public void findById(Long id) throws DaoFindException {
}
@SuppressWarnings("unchecked")
private Class<Model> getDaoClass() {
final ParameterizedType parameterizedType = (ParameterizedType) this.getClass().getGenericSuperclass();
return (Class<Model>) parameterizedType.getActualTypeArguments()[0];
}
}
O método getDaoClasse é usado no método findAll para revelar o nome da classe em questão. Existe alguma outra forma “mais correta” de fazer isso?