2013-05-27 9 views
28

में डिस्कमिमिनेटर वैल्यू एनोटेशन का उपयोग कब करें हाइबरनेट में डिस्कमिनेटर वैल्यू एनोटेशन का उपयोग करने के लिए सबसे अच्छा परिदृश्य कब और कब होता है?हाइबरनेट

+1

आप शामिल हैं प्रलेखन के माध्यम से जाने की कोशिश की, सीए n http://docs.jboss.org/hibernate/stable/annotations/reference/en/html_single/#d0e1168 और http://docs.jboss.org/hibernate/orm/3.3/reference/en-US/html देखें /inheritance.html#inheritance-tablepersubclass-discriminator –

उत्तर

38

इन 2 लिंक मेरी मदद विरासत अवधारणा सबसे समझते हैं:

http://docs.oracle.com/javaee/6/tutorial/doc/bnbqn.html

http://www.javaworld.com/javaworld/jw-01-2008/jw-01-jpa1.html?page=6

discriminator को समझने के लिए सबसे पहले अपने विरासत रणनीति को समझना चाहिए: SINGLE_TABLE, शामिल हो गए, TABLE_PER_CLASS।

डिस्कमिनेटर आमतौर पर SINGLE_TABLE विरासत में उपयोग किया जाता है क्योंकि आपको रिकॉर्ड के प्रकार की पहचान करने के लिए कॉलम की आवश्यकता होती है।

उदाहरण: आपके पास कक्षा छात्र और 2 उप-वर्ग हैं: गुड स्टूडेंट और बैडस्ट्यूडेंट। अच्छे और खराब दोनों डेटा 1 टेबल में संग्रहीत किए जाएंगे, लेकिन निश्चित रूप से हमें इस प्रकार को जानने की आवश्यकता है और वह तब होता है जब डिस्कमिनेटर कॉलम आ जाएगा। ऊपर दिए गए लिंक देखें।

4

जब आपके पास एकल तालिका रणनीति का उपयोग करके एक इकाई विरासत है, और आप चाहते हैं कि भेदभावकर्ता कॉलम का मूल्य इकाई कंक्रीट वर्ग के वर्ग के नाम के अलावा कुछ और हो, या जब भेदभावकर्ता कॉलम का प्रकार हो STRING नहीं

यह उदाहरण के साथ, the javadoc में समझाया गया है।

0

यहाँ, विवरण और वर्ग पदानुक्रम प्रति हाइबरनेट मेज पर एक उदाहरण है पर विचार हम आधार वर्ग भुगतान नामित और क्रेडिटकार्ड की तरह 2 व्युत्पन्न वर्ग है, की जाँच करें

हम क्रेडिटकार्ड की तरह व्युत्पन्न वर्ग वस्तु को सहेजते हैं या फिर स्वचालित रूप से जाँच करें भुगतान वर्ग वस्तु डेटाबेस में भी सहेजी जाएगी, और डेटाबेस में सभी डेटा केवल एक ही तालिका में संग्रहीत किया जाएगा, जो निश्चित रूप से बेस क्लास तालिका है।

लेकिन यहां हमें डेटाबेस में एक अतिरिक्त भेदभावकर्ता कॉलम का उपयोग करना चाहिए, यह पहचानने के लिए कि बेस क्लास ऑब्जेक्ट के साथ तालिका में कौन सी व्युत्पन्न क्लास ऑब्जेक्ट को सहेजा गया है, अगर हम इस कॉलम हाइबरनेट का उपयोग नहीं कर रहे हैं तो अपवाद फेंक देगा

0

मुझे आपको एक उदाहरण के साथ समझाएं। मान लीजिए कि आपके पास पशु और पशु वर्ग के तहत एक वर्ग है, वहां कई उप-वर्ग हैं जैसे सरीसृप, पक्षी ... आदि।

और डेटाबेस आप तालिका है में, ANIMAL

--------------------------- 
ID||NAME  ||TYPE  || 
--------------------------- 
1 ||Crocodile ||REPTILE || 
--------------------------- 
2 ||Dinosaur ||REPTILE || 
--------------------------- 
3 ||Lizard ||REPTILE || 
--------------------------- 
4 ||Owl  ||BIRD  || 
--------------------------- 
5 ||parrot ||BIRD  || 
--------------------------- 

यहां कॉलम TYPE DiscriminatorColumn कहा जाता है कहा जाता है क्योंकि इस स्तंभ डेटा है कि स्पष्ट रूप से सरीसृप और पक्षियों को अलग करती हैं। और डेटा REPTILE और BIRD कॉलम TYPE में डिस्कमिनेटर वैल्यू हैं।

तो जावा भाग में इस संरचना लगेगा जैसे:

पशु वर्ग:

@Getter 
@Setter 
@Table(name = "ANIMAL") 
@Entity 
@Inheritance(strategy = InheritanceType.SINGLE_TABLE) 
@DiscriminatorColumn(discriminatorType = DiscriminatorType.STRING, name = "TYPE") 
public class Animal { 

    @Id 
    @Column(name = "ID") 
    private String id; 

    @Column(name = "NAME") 
    private String name; 

} 

सरीसृप वर्ग:

@Entity 
@DiscriminatorValue("REPTILE") 
public class Reptile extends Animal { 

} 

बर्ड वर्ग:

@Entity 
@DiscriminatorValue("BIRD") 
public class Bird extends Animal { 

}