2011-02-01 9 views
9

के बिना हाइबरनेट में एक तालिका में एकाधिक वर्गों को मैप करना, मेरे पास दो हाइबरनेट वर्ग हैं: एक बेस क्लास, और एक विस्तारित कक्षा जिसमें अतिरिक्त फ़ील्ड हैं। (। ये फील्ड अन्य तालिकाओं से मैप की जाती हैं)एक डीटीईपीई कॉलम

उदाहरण के लिए, मेरे पास है:

@Entity 
@Table(name="Book") 
public class A { 
    private String ID; 
    private String Name; 
    // ... 
} 

@Entity 
@Table(name="Book") 
public class B extends A { 
    public String node_ID; 
    // ... 
} 

public class Node { 
    public String ID; // maps to B.node_ID 
    // ... 
} 

मैं कैसे हाइबरनेट में इस मैप करते हैं? The hibernate documentation तीन प्रकार की उत्तराधिकारी कॉन्फ़िगरेशन कहता है: प्रति वर्ग एक टेबल, एक प्रकार का कॉलम वाला एक टेबल, और एक जॉइन टेबल - इनमें से कोई भी यहां लागू नहीं होता है।

मुझे ऐसा करने की आवश्यकता है क्योंकि कक्षा ए जेनेरिक फ्रेमवर्क से है जिसे कई परियोजनाओं पर पुन: उपयोग किया जाता है, और कक्षा बी (और नोड) एक परियोजना के लिए विशिष्ट एक्सटेंशन हैं - इन्हें फिर से उपयोग नहीं किया जाएगा। भविष्य में, शायद मेरे पास घर_आईडी या किसी अन्य क्षेत्र के साथ कक्षा सी हो सकती है।

संपादित करें: अगर मैं ऊपर छद्म कोड विन्यास (दो संस्थाओं को एक ही मेज पर मैप किया) मैं एक त्रुटि है कि DTYPE स्तंभ मौजूद नहीं है पाने की कोशिश करो। HQL है एक "जहां DTYPE = 'ए' संलग्न

+0

इन कक्षाओं discriminator स्तंभ के बिना एक ही मेज पर मैप किए जाते हैं, तो कैसे भेद जो जो है हाइबरनेट होगा? – axtavt

+0

@axtavt यह बात है; बी का हर उदाहरण भी ए है। – ashes999

उत्तर

10

यह @DiscriminatorColumn और दोनों वर्गों के लिए एक ही मूल्यों के @DiscriminatorValue मैप करके संभव है;। यह किसी भी स्तंभ से हो सकता है आपको लगता है कि एक ही डेटा जो की परवाह किए बिना है का उपयोग टाइप करें (यकीन नहीं अगर यह शून्य मान के साथ काम करता है)

कक्षाएं तो तरह दिखना चाहिए:।

@Entity 
@Table(name="Book") 
@Inheritance(strategy=InheritanceType.SINGLE_TABLE) 
@DiscriminatorColumn(name="published") 
@DiscriminatorValue(value="true") 
public class A { 
    private String ID; 
    private String Name; 
    // ... 
} 

@Entity 
@Table(name="Book") 
@DiscriminatorValue(value="true") 
public class B extends A { 
    public String node_ID; 
    // ... 
} 
संबंधित मुद्दे