2011-08-09 19 views
14

के साथ हाइबरनेट का उपयोग करना मुझे कुछ परेशानी हो रही है कि कैसे हाइबरनेट जेनेरिक से संबंधित है और मेरे लक्ष्य को पूरा करने का सबसे अच्छा तरीका सोच रहा था।जेनेरिक

एक सरल सामान्य इकाई को देखते हुए:

@Entity 
public class Box<T>{ 

    private T t;  
    @Id 
    private long id; 

    public void setT(T t) { 
     this.t = t; 
    } 

    public T getT() { 
     return t; 
    } 

    public void setId(long id) { 
     this.id = id; 
    } 

    public long getId() { 
     return id; 
    } 
} 

जब हाइबरनेट प्रारंभ से गुजर रही है, मैं अपवाद हो रही है: ...has an unbound type and no explicit target entity. Resolve this Generic usage issue or set an explicit target attribute (eg @OneToMany(target=) or use an explicit @Type

मैं लगभग निश्चित इस वजह से मैं की एक सूची हाइबरनेट नहीं दिया है हूँ वास्तव में <T> के प्रतिबंध क्या हो सकते हैं। मुझे पता है कि आप एनोटेशन में t से ऊपर targetEntity=String.class जैसी चीजें निर्दिष्ट कर सकते हैं, लेकिन फिर आप जेनेरिक होने की लचीलापन खो देते हैं। क्या मैं एनोटेशन का उपयोग कर एक स्वीकार्य जेनेरिक के दायरे को सीमित कर सकता हूं? उदाहरण के लिए: यदि मुझे कक्षा ChildA, ChildB कक्षाएं चाहिए, तो वहां एक अस्थायी कक्षा Parent से उत्तराधिकारी होने के लिए उत्तराधिकारी होना चाहिए। इसके अलावा, यह String एस स्वीकार करने में सक्षम होना चाहिए। Hibernate ऐसी चीज से निपट सकता है?

+2

साथ इसे चलाने के लिए कैसे आप इस तरह के एक सामान्य वस्तु का निर्माण करने के हाइबरनेट उम्मीद करते हैं? ऐसा लगता है कि आपको किसी प्रकार का भेदभावकर्ता स्तंभ होना होगा और उपयोग की जा सकने वाली सभी संभावित वस्तुओं की पहचान करना होगा। लेकिन, मुझे नहीं पता कि यह यहां संभव है या नहीं। – Jeremy

+1

वही है जो मैं पूछ रहा हूं! :) – Ryan

उत्तर

13

को परिभाषित करना होगा क्या आप देख रहे हैं शायद हाइबरनेट के implicit polymorphism है। little-known "any" relationship भी है जो पूर्ण लचीलापन देता है, लेकिन इसमें इसके व्यापारिक कार्य हैं। आप many-to-any में "किसी भी" का उपयोग भी कर सकते हैं।

संपादित करें: मैं Github पर एक runnable उदाहरण अपने "बॉक्स" वर्ग के आसपास आधारित बनाया है और एक @Any मानचित्रण का उपयोग किया है। आप browse it कर सकते हैं (या Box class विशेष रूप से) या इसे बाहर की जाँच और

git clone git://github.com/zzantozz/testbed tmp 
cd tmp 
mvn -q compile exec:java -Dexec.mainClass=rds.hibernate.AnyMapping -pl hibernate-any 
+0

रयान को विशेषज्ञ बनाने के लिए targetEntity फ़ील्ड का उपयोग कर सकते हैं, क्या कहीं भी ऑनलाइन है जिसमें जेनेरिक का उपयोग करके इस प्रकार के मैपिंग का उपयोग करने का संदर्भ है? मेरा मानना ​​है कि आप यहां जो संदर्भ दे रहे हैं उसका विवरण मिला है: http://v4forums.wordpress.com/2008/12/27/implicit-explicit-polymorphism-in-hibernate/ हालांकि वह उदाहरण संतुष्ट नहीं लगता है मैं करना चाहता हूँ। क्या आप कह रहे हैं कि मैं अपने जेनेरिक फ़ील्ड्स को @any (xxx) के साथ कक्षाओं के साथ एनोटेट कर सकता हूं? – Ryan

+0

मुझे आपको [नए 3.6 डॉक्स] (http://docs.jboss.org/hibernate/core/3.6/reference/en-US/html/mapping.html#mapping-types-anymapping) पर निर्देशित करना चाहिए था। उनके पास अधिक जानकारी है। मैंने उस लिंक के साथ और एक चलने योग्य उदाहरण के साथ अपना जवाब अपडेट किया। –

+0

इस के माध्यम से जाने के लिए बहुत बहुत धन्यवाद। उत्कृष्ट स्पष्टीकरण और उत्तर। – Ryan

4

मैंने पहले ही ऐसा किया है लेकिन सबक्लास के साथ।

आपका सामान्य वर्ग सार होना चाहिए और उपवर्गों सामान्य पैरामीटर

+0

मैं उस भाग को समझता हूं, लेकिन किसी ऑब्जेक्ट प्रकार के बारे में क्या है जैसे 'स्ट्रिंग' जिसका उस विरासत के पेड़ से कोई लेना देना नहीं है। क्या अतिरिक्त रूप से निर्दिष्ट करना संभव है? – Ryan

+0

मैं जो कहना चाहता हूं वह यह है कि आप केवल जेनेरिक निर्दिष्ट कर सकते हैं यदि क्लास जेनेरिक परिभाषा डेटाबेस में सहेजी नहीं जाती है क्योंकि हाइबरनेट को पता नहीं है कि क्या सहेजना है। आप –