2009-04-29 28 views
11

Temel kaba işlemleri gerçekleştiren, parametreli hazırda bekletme dao'm var ve parametrelendirildiğinde, belirli bir dao için temel işlemlerin gerçekleştirilmesi için bir temsilci olarak kullanılır. ,Genel T türünden Sınıflandırma T

yok

T.getClass() 
:

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

biliyorum:

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

ben böyle, Hibernate kriterler sorguları oluşturmak için çalışma zamanında T'den Class türetmek mümkün istiyorum ama çalışma zamanında T'den doğru Sınıf nesnesini türetmenin herhangi bir yolu var mı?

Jeneriklere ve yansımalara baktım ama uygun bir çözüm bulmuyorum, belki de bir şeyleri özlüyorum.

Teşekkürler.

cevap

17

Sınıf bir yapıcı argümanı olarak geçirilmiş olabilir.

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

} 

bu sadece varsayalım: Burada
private Class<T> persistentClass = (Class<T>) 
    ((ParameterizedType)getClass().getGenericSuperclass()).getActualTypeArguments()[0]; 

bunu nasıl kullandığını yoludur:

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

Evet Bu sahip tek çözümdür. Sınıf bağımlılığını eklemeden, mümkünse sınıfı T'den türetmeyi tercih ederim. – bowsie

+8

@bowsie: Acını anlıyorum. Ne yazık ki, derleyici T tüm izlerini siler. Bu tip silme adı verilir: http://java.sun.com/docs/books/tutorial/java/generics/erasure.html –

+0

Ahh tamam, teşekkürler Adam. – bowsie

7

yansıma kullanarak tipi argüman T ait class anlamaya nasıl yol yoktur ConcreteEntityDao, HibernateDao<ConcreteEntity,...>'un doğrudan bir üst sınıfı olduğunda çalışır.

burada buldum: www.greggbolinger.com/blog/2008/04/17/1208457000000.html

+1

bu yalnızca parametreli nesneyi oluşturan yöntemde (yığın konumu) çalışır. Başka bir yöntemden parametreli nesne alırsanız çalışmaz. –

+0

Anladığımdan emin değilim. Biraz daha ayrıntılı olarak açıklar mısınız? Web uygulaması geliştirme için herhangi bir etkisi var mı? – rdk

+0

Bu, genel sınıfı doğrudan alt sınıflara ayırdığınızda harika çalışır. Birden fazla kalıtım seviyeniz varsa, 'getSuperClass' kullanarak' figureOutPersistentClass' şeklinde hesaplamanız gerekir. –