2009-04-29 28 views
11

से कक्षा प्राप्त करना मेरे पास पैरामीटरकृत हाइबरनेट डाओ है जो मूल क्रूड ऑपरेशंस करता है, और जब दिए गए दाओ के लिए मूल क्रूड ऑपरेशंस को पूरा करने के लिए पैरामीटर का उपयोग प्रतिनिधि के रूप में किया जाता है।जेनेरिक टी

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.getClass() 

मौजूद नहीं है, लेकिन क्या रनटाइम पर टी से सही क्लास ऑब्जेक्ट प्राप्त करने का कोई तरीका है?

मैंने जेनेरिक और प्रतिबिंब को देखा है लेकिन एक उपयुक्त समाधान के साथ नहीं आया है, शायद मुझे कुछ याद आ रही है।

धन्यवाद।

उत्तर

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

हाँ यह एक समाधान मेरे पास है। क्लास निर्भरता को जोड़ने के बिना, यदि संभव हो तो मैं कक्षा से कक्षा को प्राप्त करने में सक्षम होना पसंद करूंगा। – bowsie

+8

@ बोवेसी: मैं आपके दर्द को समझता हूं। दुर्भाग्यवश, कंपाइलर पूरा करता है टी के सभी निशान मिटा देता है। इसे टाइप एरर कहा जाता है: http://java.sun.com/docs/books/tutorial/java/generics/erasure.html –

+0

आह ठीक है, धन्यवाद एडम। – bowsie

7

कैसे प्रतिबिंब का उपयोग प्रकार तर्क T की class यह पता लगाने की तरीका नहीं है काम करता है जब आपका ConcreteEntityDaoHibernateDao<ConcreteEntity,...> का प्रत्यक्ष सुपरक्लास है।

मैं इसे यहाँ मिल गया है: www.greggbolinger.com/blog/2008/04/17/1208457000000.html

+1

यह केवल विधि (स्टैक स्थान) में काम करता है जो पैरामीटरयुक्त वस्तु बनाता है। यदि आप किसी अन्य विधि से पैरामीटरयुक्त ऑब्जेक्ट प्राप्त करते हैं तो यह काम नहीं करता है। –

+0

मुझे यकीन नहीं है कि मैं समझता हूं। क्या आप इसे थोड़ा और विस्तार से समझा सकते हैं? क्या वेब अनुप्रयोग विकास के लिए कोई प्रभाव है? – rdk

+0

जब आप जेनेरिक क्लास को सीधे उपclass करते हैं तो यह बहुत अच्छा काम करता है। यदि आपके पास विरासत के कई स्तर हैं, तो आपको 'getSupPersistentClass' में 'getSuperClass' का उपयोग करके उनके लिए खाते की आवश्यकता होगी। –

संबंधित मुद्दे