2013-04-18 6 views
34

मैं अक्सर इस तरह मेरी @Column एनोटेशन निर्दिष्ट:@ कॉलम कॉलम परिभाषा क्या गुण करता है अनावश्यक बनाता है?

@Column(columnDefinition="character varying (100) not null",length=100,nullable=false) 

आप मैं length और nullable भले ही columnDefinition पहले से ही उन निर्दिष्ट करता है निर्दिष्ट देख सकते हैं। ऐसा इसलिए है क्योंकि मुझे नहीं पता कि ये मान कहां/कब उपयोग किए जाते हैं।

तो, columnDefinition निर्दिष्ट करते समय, @Column के अन्य गुणों को अनावश्यक बना दिया गया है?

अगर यह मायने रखती है, मैं हाइबरनेट और PostgreSQL

+0

यदि आप इसे निर्दिष्ट करने जा रहे हैं तो सटीक कॉलम आपके डेटाबेस में बनाया जाएगा अन्यथा यह डेटाबेस –

+2

के अनुसार डिफ़ॉल्ट रूप से बनाया जाएगा, मुझे यह जोड़ना चाहिए कि अब मैं इस संपत्ति का उपयोग नहीं करता हूं, और अपना खुद का डीडीएल करना पसंद करते हैं। –

उत्तर

52

मेरे उत्तर: निम्न में से सभी (यानी उन सब को अगर उचित columndefinition भीतर का वर्णन है,) अधिरोहित किया जाना चाहिए:

  • length
  • precision
  • scale
  • nullable
  • unique

अर्थात स्तंभ DDL से मिलकर बनता है: name + columndefinitionऔर बाकी कुछ भी नहीं।

तर्क निम्नानुसार है।


  1. शब्द "कॉलम" या "तालिका" युक्त एनोटेशन विशुद्ध भौतिक है - गुण केवल डेटाबेस के खिलाफ DDL/DML नियंत्रित करने के लिए इस्तेमाल किया।

  2. अन्य एनोटेशन पूरी तरह तार्किक - जेपीए प्रसंस्करण को नियंत्रित करने के लिए जावा में स्मृति में उपयोग की जाने वाली गुण।

  3. यही कारण है कि कभी-कभी ऐसा लगता है कि वैकल्पिकता/शून्यता दो बार सेट की जाती है - एक बार @Basic(...,optional=true) के माध्यम से और एक बार @Column(...,nullable=true) के माध्यम से। पूर्व कहते हैं कि विशेषता/एसोसिएशन जेपीए ऑब्जेक्ट मॉडल (इन-मेमोरी) में फ्लश समय पर शून्य हो सकता है; बाद में कहता है कि डीबी कॉलम शून्य हो सकता है। आम तौर पर आप चाहते हैं कि वे वही सेट करें - लेकिन हमेशा नहीं, डीबी टेबल कैसे सेट किए जाते हैं और पुन: उपयोग किए जाते हैं।

आपके उदाहरण में, लंबाई और नामुमकिन गुण ओवरराइड और अनावश्यक हैं।


तो, जब columnDefinition निर्दिष्ट करते समय, क्या @Column की अन्य संपत्तियों बेमानी बना रहे हैं?

  1. जेपीए युक्ति & जावाडोक में:

    • columnDefinition परिभाषा: एसक्यूएल टुकड़ा है कि जब स्तंभ के लिए DDL पैदा किया जाता है।

    • columnDefinition डिफ़ॉल्ट: जेनरेट किए गए एसक्यूएल अनुमानित प्रकार का एक स्तंभ बनाने के लिए।

    • निम्न उदाहरण प्रदान की जाती हैं:

      @Column(name="DESC", columnDefinition="CLOB NOT NULL", table="EMP_DETAIL") 
      @Column(name="EMP_PIC", columnDefinition="BLOB NOT NULL") 
      
    • और, अरे ..., कि यह वास्तव में है। : - $?

    करता columnDefinition ही एनोटेशन में उपलब्ध कराई गई अन्य संपत्तियों को ओवरराइड?

    जावाडोक और जेपीए स्पेक इस बात को संबोधित नहीं करते हैं - कल्पना महान सुरक्षा नहीं दे रही है। 100% सुनिश्चित करने के लिए, अपने चुने हुए कार्यान्वयन के साथ परीक्षण करें।

  2. निम्नलिखित सुरक्षित रूप से जेपीए कल्पना में दिए गए उदाहरणों से गर्भित किया जा सकता है

    • name & tablecolumnDefinition साथ संयोजन के रूप में इस्तेमाल किया जा सकता है, न तो
    • nullable अधिरोहित कर रहे हैं ओवरराइड की गई है/निरर्थक बना दिया columnDefinition
  3. निम्नलिखित "स्थिति के तर्क" से काफी सुरक्षित रूप से निहित किया जा सकता है (क्या मैंने बस यह कहा था ?? :-P):

    • length, precision, scale अधिरोहित/columnDefinition द्वारा अनावश्यक बना रहे हैं - वे प्रकार
    • insertable और updateable अलग है और कभी नहीं प्रदान की जाती हैं columnDefinition में शामिल का अभिन्न अंग हैं, क्योंकि डेटाबेस में उत्सर्जित होने से पहले, वे एसक्यूएल पीढ़ी इन-मेमोरी को नियंत्रित करते हैं।
  4. यह केवल "unique" संपत्ति छोड़ देता है। यह शून्य के समान है - प्रकार परिभाषा को विस्तार/योग्यता देता है, इसलिए परिभाषा टाइप करने के लिए अभिन्न अंग का इलाज किया जाना चाहिए। यानी ओवरराइड किया जाना चाहिए।


टेस्ट मेरे उत्तर कॉलम के लिए 'ए' & "बी", क्रमशः:

@Column(name="...", table="...", insertable=true, updateable=false, 
      columndefinition="NUMBER(5,2) NOT NULL UNIQUE" 

    @Column(name="...", table="...", insertable=false, updateable=true, 
      columndefinition="NVARCHAR2(100) NULL" 
  • पुष्टि उत्पन्न तालिका सही प्रकार/nullability/विशिष्टता है
  • वैकल्पिक रूप से, जेपीए डालें & अद्यतन: पूर्व में कॉलम ए शामिल होना चाहिए , बाद के कॉलम बी
5

columnDefinition का उपयोग इस विशेष स्तंभ के लिए हाइबरनेट द्वारा उत्पन्न एसक्यूएल DDL को पार कर जाएगी, यह गैर पोर्टेबल है और क्या डेटाबेस का उपयोग कर रहे पर निर्भर करता है। आप इसे शून्य, लंबाई, परिशुद्धता, पैमाने ... ect निर्दिष्ट करने के लिए उपयोग कर सकते हैं।

+0

मुझे पता है कि यह क्या करता है, और यह पोर्टेबल नहीं है, लेकिन डीडीएल पीढ़ी एकमात्र जगह है जहां अन्य गुण ('लंबाई ',' शून्य ', आदि) आमतौर पर उपयोग किए जाते हैं? –

+0

'javax.persistence.Column' के स्रोत कोड के अनुसार, गुण:' अद्वितीय', 'शून्य ',' कॉलम परिभाषा ',' लंबाई',' परिशुद्धता ',' स्केल' केवल डीडीएल पीढ़ी के लिए उपयोग किया जाता है, गुण: ' नाम', 'टेबल' का उपयोग कॉलम मैपिंग और गुणों को निर्दिष्ट करने के लिए किया जाता है: 'insertable',' updatable' का उपयोग यह निर्दिष्ट करने के लिए किया जाता है कि कॉलम को एसएसएल INSERT/UPDATE स्टेटमेंट में बनाए रखा गया है जो दृढ़ता प्रदाता द्वारा उत्पन्न किया गया है। – Septem

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