2009-04-29 5 views
11

기본 crud 작업을 수행하는 매개 변수화 된 최대 절전 모드 DAO가 있고 지정된 매개 변수에 대한 기본 crud 작업을 수행하기 위해 매개 변수화 된 매개 변수가 대리자로 사용되는 경우 ,일반 T에서 클래스 파생

이 존재하지 않는

T.getClass() 
:

public T findByPrimaryKey(ID id) { 
    return (T) HibernateUtil.getSession().load(T.getClass(), id); 
} 

내가 아는 :

public class HibernateDao <T, ID extends Serializable> implements GenericDao<T, ID> 

나는 그런, 최대 절전 모드에서 기준 쿼리를 생성하는 런타임에 T에서 클래스를 파생 할 수 있도록하려면 하지만 런타임에 T에서 올바른 Class 객체를 파생시킬 수있는 방법이 있습니까?

제네릭과 리플렉션을 살펴 보았지만 적합한 솔루션이 없으므로 아마도 뭔가 누락되었습니다.

감사합니다.

답변

17

클래스에 생성자 인수를 전달할 수 있습니다.

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(); 
    } 

} 

내가이 단지 가정 : 여기
private Class<T> persistentClass = (Class<T>) 
    ((ParameterizedType)getClass().getGenericSuperclass()).getActualTypeArguments()[0]; 

내가 그것을 사용하는 방법 방법입니다 :

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; 
    } 

    // .... 

} 
+0

예이 내가 가진 하나 개의 솔루션입니다. Class 종속성을 추가하지 않고 가능한 한 T에서 클래스를 파생시킬 수 있기를 원합니다. – bowsie

+8

@bowsie : 당신의 고통을 이해합니다. 불행하게도, 컴파일러는 T의 모든 흔적을 지우면서 완료합니다. 타입 지우기라고합니다 : http://java.sun.com/docs/books/tutorial/java/generics/erasure.html –

+0

Ahh okay, thanks Adam. – bowsie

7

반사를 사용하여 형식 인수 Tclass을 파악하는 방법을 방법이있다 ConcreteEntityDao이 직접 수퍼 클래스 인 HibernateDao<ConcreteEntity,...> 일 때 작동합니다.

내가 여기를 발견했습니다 www.greggbolinger.com/blog/2008/04/17/1208457000000.html

+1

이것은 매개 변수화 된 개체를 만드는 메서드 (스택 위치)에서만 작동합니다. 다른 메서드에서 매개 변수가있는 개체를 받으면 작동하지 않습니다. –

+0

나는 내가 이해할 지 모르겠다. 조금 더 자세하게 설명해 주시겠습니까? 웹 애플리케이션 개발에 어떤 영향이 있습니까? – rdk

+0

제네릭 클래스를 직접 하위 클래스로 만들 때 유용합니다. 상속 수준이 여러 개인 경우'getSuperClass'를 사용하여'figureOutPersistentClass'에서 상속 수준을 고려해야합니다. –