2012-07-11 8 views
6

मैंने नीचे दिखाए गए विरासत के साथ Grails में अपने डोमेन कक्षाओं का मॉडल किया है।Grails/Groovy डोमेन क्लासेस विरासत कास्ट

abstract class Profile{ 
} 

class Team extends Profile{ 
} 

class User extends Profile{ 
} 

class B{ 
    static hasMany = [profiles: Profile] 
} 

नियंत्रकों जब मैं कक्षा बी कुछ स्थितियों में मैं प्रोफाइल के कुछ दल या उपयोगकर्ता के लिए करने के लिए कास्ट करना चाहते से सभी प्रोफाइल पाने में बाद में, लेकिन मुझे नहीं क्योंकि मैं एक जावा मिल सकती है। lang.ClassCastException या GroovyCastException, हालांकि वे किसी टीम या उपयोगकर्ता के रूप में सहेजे जाते हैं (डेटाबेस में विशेषता वर्ग के साथ)।

def team1 = b.profiles.toList()[0] as Team 

def team1 = (Team)b.profiles.toList()[0] 

यह काम कर रहा है जब मैं के रूप में यह एक गतिशील भाषा में सामान्य है किसी भी प्रकार की बस के लिए इसका इस्तेमाल नहीं लिखते: यहाँ तरीके मैं कोशिश की है कर रहे हैं।

def team1 = b.profiles.toList()[0] 

लेकिन तब मैं कभी नहीं जानता कि मैं किस वर्ग का उपयोग कर रहा हूं। क्या माता-पिता वर्ग को बच्चे को डालने के लिए ग्रोवी या गोर में वैसे भी है?

+0

वहाँ GORM 'के बीच चयन करने के लिए कोई [discriminator] है (http://grails.org/doc/latest/ref/Database%20Mapping/discriminator.html) उपयोगकर्ता 'या' टीम '। गोरम को कैसे तय करना चाहिए कि किस कार्यान्वयन का उपयोग करना है? – krock

+0

यह क्लास विशेषता के साथ डेटाबेस में एक ही तालिका में सहेजता है जो इंगित करता है कि यह कौन सा वर्ग है। – sgleser87

उत्तर

4

उत्तर कोई वास्तविक गोर्म/हाइबरनेट उदाहरण के रूप में एक प्रॉक्सी ऑब्जेक्ट है। तो इसे सीधे एक इकाई वर्ग में नहीं डाला जा सकता है।

वैसे भी इस मदद कर सकता है:

def team1 = b.profiles.toList()[0] 
if(team1.instanceOf(Team)) { 
    // I am an instance of Team 
    // do something here. 
} 
+0

यह काम कर रहा है, लेकिन असल में यह मेरा सवाल नहीं था। मेरा सवाल यह था कि अगर बेस क्लास को उप-वर्ग में स्पष्ट रूप से डालने का कोई तरीका है। – sgleser87

+3

नहीं, क्योंकि हाइबरनेट प्रॉक्सी शब्द की जावा भावना में उप-वर्ग 'उदाहरण' नहीं है। प्रॉक्सी क्लास _declared_ प्रकार 'b.profiles' (यानी' प्रोफ़ाइल') के गतिशील रूप से जेनरेट किए गए उप-वर्ग है। [यह आलेख] (http://blog.springsource.org/2010/07/28/gorm-gotchas-part-3/) में गोरी का विवरण है, और यह (और एक ही श्रृंखला में अन्य लेख) अच्छी तरह से मूल्यवान हैं एक पढ़ा –

+3

हमेशा 'GrailsHibernateUtil.unwrapIfProxy' है, जो प्रॉक्सी रैपर को हटा देगा और आपको वास्तविक ऑब्जेक्ट देगा (जिसे आप तब कास्ट कर सकते हैं) लेकिन वास्तविक ऑब्जेक्ट को पहले से लोड नहीं किया गया है, तो इसे डेटाबेस को हिट करना होगा। –

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