문제

기본 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

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top