2010-06-09 13 views
20

पर DiscriminatorValue प्राप्त करने के लिए हमारे पास निम्न वर्गोंकैसे रन टाइम

@Entity 
@Inheritance(strategy = InheritanceType.SINGLE_TABLE) // optional annotation as this is default 
@DiscriminatorColumn(name = "apType", discriminatorType = DiscriminatorType.STRING, length = 255) 
@DiscriminatorValue("AP") 
public class ApplicationProcess { 
} 

और यह

@Entity 
@DiscriminatorValue("APS") 
public class ApplicationProcessScheme extends ApplicationProcess { 
} 

अब मैं कार्यावधि में जानना चाहते हैं कि ApplicationProcessDiscriminatorValueAP or APS की है की जरूरत है। चूंकि यह स्वचालित रूप से जेपीए द्वारा संभाला जाता है, इसलिए मेरे पास यह मान प्राप्त करने का कोई तरीका नहीं है।

हम एक विधि को कॉल कर रहे हैं जो ApplicationProcess पैरामीटर के रूप में लेता है, और मैं यह देखने के लिए instanceof का उपयोग करना चाहता हूं कि यह किस प्रकार है। कूलर नहीं होगा अगर मैं की तरह

applicationProcess.getApType().equals("AP"); 

उत्तर

34

आप केवल पढ़ने के लिए संपत्ति के रूप में अपने discriminator मैप कर सकते हैं:

public class ApplicationProcess { 

    ... 

    @Column(name = "apType", insertable = false, updatable = false) 
    private String apType; 

} 
+0

@ शेरविन: आप कर सकते हैं, लेकिन यह एक अच्छा विचार नहीं है, आपका तर्क उस पर भरोसा नहीं करना चाहिए । –

+1

@ पास्कल: मुझे लगता है कि मुझे करना है। एक्सएचटीएमएल पक्ष पर मेरे पास 'आवृत्ति' (मुझे लगता है) कहने के लिए ईएल अभिव्यक्ति में कोई रास्ता नहीं है। तो मुझे इसकी आवश्यकता हो सकती है। –

+1

@ शेरविन: मुझे ऐसा कहने में खेद है, लेकिन ऐसा लगता है कि आपके डिजाइन में एक बड़ी गड़बड़ी है, ** देखें ** को कभी भी भेदभाव करने वाले मूल्य पर भरोसा नहीं करना चाहिए (यह व्यवसाय कोड के लिए भी सही है लेकिन इसके लिए और भी कुछ दृश्य)। –

5

हम एक विधि है कि पैरामीटर के रूप में एक ApplicationProcess लेता बुला रहे हैं कुछ कर सकते हैं, और मैं instanceof का उपयोग कर जो भी लिखते यह है की जाँच करने के बचना चाहते हैं। कूलर नहीं होगा अगर मैं

की तरह कुछ (...) मुझे नहीं लगता कि यह कूलर होगा कर सकता है, यह मेरे लिए instanceOf बुला से भी बदतर लगता है: जो भी कारण आप discriminator मान बदलने के लिए है, यह आपका कोड तोड़ देगा।

यदि आपको प्रकार की जांच करने की आवश्यकता है, तो instanceOf का उपयोग करें। भेदभाव करने वाले का उपयोग करने वाली चाल चीजों को अच्छी तरह से बनाने वाली नहीं है, यह आपके कोड को कम मजबूत बना देगी।

+1

+1 मैं पूरी तरह से सहमत हूं। शायद यह मेरा रिफैक्टरिंग लागू हो सकता है: http://www.c2.com/cgi/wiki?ReplaceConditionalWithPolymorphism –

+0

लेकिन फिर मुझे ऐसा कुछ करना होगा: छद्म कोड: 'अगर (एप्लिकेशन प्रोसेस प्रोसेम उदाहरण नहीं है), क्योंकि मैं एप्लिकेशनप्रोसेस के खिलाफ जांच नहीं कर सकता क्योंकि एप्लिकेशनप्रोसेसशेम भी से मेल खाएगा, तो कोड होगा अगर (अगर कोई एप्लीकेशन नहीं है, उदाहरण के लिए} {// क्योंकि कोई बच्चा नहीं है} // // हमारे पास एक बच्चा है!} ' –

+1

@ शेरविन: हाँ, आपको यह करना होगा। मैं यह आदर्श नहीं कह रहा हूं, मैं कह रहा हूं कि मेटाडेटा पर भरोसा करना बुरा होगा। दरअसल, मैं @ एश के सुझाव खोदना चाहता हूं। –

29

मैं कुछ मामलों में जहां यह सहायक हो सकती कल्पना कर सकते हैं, लेकिन कारण है कि आप इस की जरूरत के बावजूद, आप अपने अमूर्त वर्ग पर बना सकते हैं विधि

@Transient 
public String getDiscriminatorValue(){ 
    DiscriminatorValue val = this.getClass().getAnnotation(DiscriminatorValue.class); 

    return val == null ? null : val.value(); 
} 
+1

एक उपयोग केस हो सकता है: कुछ सिस्टम विस्तृत अनुवाद तालिका प्रकार (देश, भाषा, लिंग, ...) और प्रति प्रकार एकाधिक कुंजी ("pl", "uk", "us", ...) और मान ("पोलैंड", "यूनाइटेड किंगडम", ...)। कुछ प्रकारों का उपयोग '@ OneToMany' रिश्तों में किया जा सकता है, जैसे कि देश को '@ एंटीटी एड्रेस' में इस्तेमाल किया जा सकता है, लेकिन अन्य प्रकारों का उपयोग केवल डेटाबेस से पूछताछ द्वारा किया जा सकता है। तो: बेस क्लास अधिकांश प्रकारों को संभालेगा, लेकिन कुछ विशिष्ट लोगों के पास अपनी व्युत्पन्न कक्षा होगी। – Arjan

+0

मेरे लिए स्वीकार्य उत्तर में समस्या तब थी जब ऑब्जेक्ट अभी बनाया गया था और अभी तक सहेजा नहीं गया है, भेदभावकर्ता मौजूद नहीं है। परीक्षण मामलों में जहां डेटा वास्तव में डीबी के लिए जारी नहीं है, मैं इसके साथ मुद्दों था। यह बहुत अच्छा काम किया। धन्यवाद –

+0

यह बहुत अच्छा काम कर रहा है। –

0

आप फ़ॉर्मूला एनोटेशन का उपयोग कर सकते हैं। आप हाइबरनेट का उपयोग कर रहे हैं, तो आप this link के अनुसार नीचे दिए गए कोड का उपयोग कर सकते हैं:

private String theApType; 

@Formula("apType") 
String getTheApType() { 
    return theApType; 
} 

बेशक आप अपने प्रश्नों में इसका इस्तेमाल करने में सक्षम होगा।

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