Generic t에서 수업을 도출합니다
-
03-07-2019 - |
문제
기본 CRUD 작업을 수행하는 매개 변수화 된 Hibernate DAO가 있으며 매개 변수화 된 경우 주어진 DAO의 기본 CRUD 작업을 수행하기 위해 대의원으로 사용됩니다.
public class HibernateDao <T, ID extends Serializable> implements GenericDao<T, ID>
런타임에서 t에서 클래스를 도출하여 최대 절전 모드에서 기준 쿼리를 만들 수 있기를 원합니다.
public T findByPrimaryKey(ID id) {
return (T) HibernateUtil.getSession().load(T.getClass(), id);
}
알아요:
T.getClass()
존재하지 않지만 런타임에서 T에서 올바른 클래스 객체를 도출하는 방법이 있습니까?
나는 제네릭과 반사를 보았지만 적절한 해결책을 제시하지 않았을 것입니다. 아마도 무언가를 놓치고있을 것입니다.
감사.
해결책
클래스를 생성자 인수로 통과 할 수 있습니다.
public class HibernateDao <T, ID extends Serializable> implements GenericDao<T, ID> {
private final Class<? extends T> type;
public HibernateDao(Class<? extends T> type) {
this.type = type;
}
// ....
}
다른 팁
알아내는 방법이 있습니다 class
유형의 인수 T
반사 사용 :
private Class<T> persistentClass = (Class<T>)
((ParameterizedType)getClass().getGenericSuperclass()).getActualTypeArguments()[0];
여기에 내가 사용하는 방법은 다음과 같습니다.
public class GenericDaoJPA<T> implements GenericDao<T> {
@PersistenceContext
protected EntityManager entityManager;
protected Class<T> persistentClass = figureOutPersistentClass();
private Class<T> figureOutPersistentClass() {
Class<T> clazz = (Class<T>)((ParameterizedType) (getClass().getGenericSuperclass())).getActualTypeArguments()[0];
log.debug("persistentClass set to {}", clazz.getName());
return clazz;
}
public List<T> findAll() {
Query q = entityManager.createQuery("SELECT e FROM " + persistentClass.getSimpleName() + " e");
return (List<T>) q.getResultList();
}
}
나는 이것이 당신의 경우에만 작동한다고 생각합니다 ConcreteEntityDao
직접 슈퍼 클래스입니다 HibernateDao<ConcreteEntity,...>
.
여기에서 찾았습니다 : www.greggbolinger.com/blog/2008/04/17/1208457000000.html
제휴하지 않습니다 StackOverflow