2013-02-06 80 views
10

मेरे पास एक सारणी है जिसमें केवल 2 फ़ील्ड हैं। तालिका में इन दो क्षेत्रों द्वारा बनाई गई एक समग्र पीके है।2 प्राथमिक कुंजी फ़ील्ड के साथ जेपीए तालिका

डाटाबेस से इकाई बीन्स बनाने के लिए नेटबीन्स का उपयोग करते समय, इकाई बीन स्वचालित रूप से 2 से अधिक फ़ील्ड वाले अन्य सारणी की तरह नहीं बनाई जाती है।

तो मुझे लगता है कि मुझे इकाई बीन स्वयं बनाने की आवश्यकता है। इस इकाई बीन बनाने के लिए सबसे अच्छा अभ्यास क्या है? क्या इसमें COMPOSITE KEY ऑब्जेक्ट होना चाहिए या नहीं?

+0

@Xavi लोपेज़: वे पीके को एकसाथ मिलते हैं। – user2046810

उत्तर

27

मैं नेटबीन का उपयोग नहीं करता इसलिए मैं वास्तव में अपने मैपिंग टूल के बारे में कुछ भी नहीं कह सकता।

एक समग्र कुंजी मैपिंग के लिए, कुछ विकल्प हैं। आप

  • पी क्षेत्रों के साथ एक अलग @Embeddable वस्तु को परिभाषित करने और अपने @Entity कक्षा में @EmbeddedId रूप में इसका इस्तेमाल

    @Embeddable 
    public class MyCompositePK { 
        @Column 
        private String fieldA; 
        @Column 
        private String fieldB; 
    } 
    @Entity 
    public class MyBean { 
        @EmbeddedId 
        private MyCompositePK id; 
        @Column 
        private String fieldC; 
    } 
    
  • पी क्षेत्रों के साथ एक गैर मैप किया POJO परिभाषित करें और @IdClass के रूप में उपयोग कर सकते हैं @Entity में।

    @Entity 
    @IdClass(value=ClassAB.ClassABId.class) 
    public class ClassAB implements Serializable { 
        private String idA; 
        private String idB; 
    
        @Id 
        @Column(name="ID_A") 
        public String getIdA(){ return idA; } 
        public void setIdA(String idA){ this.idA = idA; } 
    
        @Id 
        @Column(name="ID_B") 
        public String getIdB(){ return idB; } 
        public void setIdB(String idB){ this.idB = idB; } 
    
        static class ClassABId implements Serializable { 
         private String idA; 
         private String idB; 
    
         public String getIdA(){ return idA; } 
         public void setIdA(String idA){ this.idA = idA; } 
    
         public String getIdB(){ return idB; } 
         public void setIdB(String idB){ this.idB = idB; } 
    
         // implement equals(), hashcode() 
        } 
    } 
    

    इस उदाहरण ClassABId में सिर्फ सुविधा के लिए एक स्थिर भीतरी वर्ग है। How to map a composite key with Hibernate?:

ये विकल्प भी इस सवाल का पास्कल Thivent उत्तम जवाब में विस्तार से बताया गया है।

यह संबंधित प्रश्न इन दृष्टिकोणों के बीच मतभेदों पर चर्चा करता है: Which anotation should I use: @IdClass or @EmbeddedId। ध्यान दें कि फ़ील्ड की घोषणा @IdClass दृष्टिकोण के साथ डुप्लीकेट हो जाती है।

किसी भी तरह, मुझे नहीं लगता कि दो वर्ग बनाने का विकल्प है। यही कारण है कि मैंने इस सवाल से पूछा: Mapping a class that consists only of a composite PK without @IdClass or @EmbeddedId। ऐसा लगता है कि इसके लिए एक हाइबरनेट-विशिष्ट सुविधा है।

एक साइड नोट के रूप में, यदि आपके पास डीबी संरचना पर नियंत्रण है, तो आप समग्र कुंजी से परहेज करने पर भी विचार कर सकते हैं। There are some reasons to do so

+2

यह देखते हुए कि ऑब्जेक्ट में केवल दो प्राथमिक कुंजी फ़ील्ड हैं, क्या यह अपना 'आईडी क्लास' हो सकता है? –

+1

@ टॉम एंडरसन यह दिलचस्प है। मैंने कभी कोशिश नहीं की। ऐसा लगता है कि [किसी ने किया] (https://forum.hibernate.org/viewtopic.php?p=2419264), बिना किसी सफलता के।इस पर spec का उच्चारण नहीं लगता है। कार्यान्वयन पर निर्भर हो सकता है। –

+1

@ टॉम एंडरसन: मुझे ऐसा नहीं लगता है, क्योंकि आईडी क्लास को समग्र कुंजी मानों के आधार पर इसके बराबर() विधि को कार्यान्वित करना है। –

0

धन्यवाद @ XaviLópez। आपके स्पष्टीकरण ने मेरे कोड को ठीक किया जिसे @Tom एंडरसन द्वारा वर्णित अपने आईडीक्लास के रूप में घोषित किया गया था। जब मैंने अपने आईडीक्लास के रूप में 2 @ आईडी कॉलम के रूप में घोषित किया, तो उस इकाई की एक सूची लाने वाली एक जेपीए क्वेरी परिणाम सूची में अपेक्षित "एन" आइटम लौटा रही थी लेकिन उस सूची में प्रत्येक आइटम शून्य है। लेकिन वह आकार "एन" की उम्मीद है। स्थैतिक आंतरिक वर्ग में बदलने के बाद जो रिफैक्टरिंग से कम है, यह परिणाम के सही सेट को वापस करने में सक्षम है।

मेरे अनुसार: स्वयं संदर्भ आईडी क्लास काम नहीं करेगा क्योंकि स्वयं स्वयं एक इकाई है और इसे दृढ़ता संदर्भ में होना चाहिए। यदि मेरे पास एक ही प्रकार की प्राथमिक कुंजी वस्तु भी है, तो दृढ़ता संदर्भ में दो "समान" वस्तुएं होंगी। तो, इसकी अनुमति नहीं दी जानी चाहिए। इसलिए, हमें स्वयं संदर्भ @IdClass का उपयोग नहीं करना चाहिए। एक प्राथमिक आंतरिक वर्ग को प्राथमिक कुंजी प्रकार के रूप में बनाएं जो कम घुसपैठ कर रहा है।