मेरे उत्तर: निम्न में से सभी (यानी उन सब को अगर उचित columndefinition
भीतर का वर्णन है,) अधिरोहित किया जाना चाहिए:
length
precision
scale
nullable
unique
अर्थात स्तंभ DDL से मिलकर बनता है: name
+ columndefinition
और बाकी कुछ भी नहीं।
तर्क निम्नानुसार है।
शब्द "कॉलम" या "तालिका" युक्त एनोटेशन विशुद्ध भौतिक है - गुण केवल डेटाबेस के खिलाफ DDL/DML नियंत्रित करने के लिए इस्तेमाल किया।
अन्य एनोटेशन पूरी तरह तार्किक - जेपीए प्रसंस्करण को नियंत्रित करने के लिए जावा में स्मृति में उपयोग की जाने वाली गुण।
यही कारण है कि कभी-कभी ऐसा लगता है कि वैकल्पिकता/शून्यता दो बार सेट की जाती है - एक बार @Basic(...,optional=true)
के माध्यम से और एक बार @Column(...,nullable=true)
के माध्यम से। पूर्व कहते हैं कि विशेषता/एसोसिएशन जेपीए ऑब्जेक्ट मॉडल (इन-मेमोरी) में फ्लश समय पर शून्य हो सकता है; बाद में कहता है कि डीबी कॉलम शून्य हो सकता है। आम तौर पर आप चाहते हैं कि वे वही सेट करें - लेकिन हमेशा नहीं, डीबी टेबल कैसे सेट किए जाते हैं और पुन: उपयोग किए जाते हैं।
आपके उदाहरण में, लंबाई और नामुमकिन गुण ओवरराइड और अनावश्यक हैं।
तो, जब columnDefinition निर्दिष्ट करते समय, क्या @Column की अन्य संपत्तियों बेमानी बना रहे हैं?
जेपीए युक्ति & जावाडोक में:
columnDefinition
परिभाषा: एसक्यूएल टुकड़ा है कि जब स्तंभ के लिए DDL पैदा किया जाता है।
columnDefinition
डिफ़ॉल्ट: जेनरेट किए गए एसक्यूएल अनुमानित प्रकार का एक स्तंभ बनाने के लिए।
निम्न उदाहरण प्रदान की जाती हैं:
@Column(name="DESC", columnDefinition="CLOB NOT NULL", table="EMP_DETAIL")
@Column(name="EMP_PIC", columnDefinition="BLOB NOT NULL")
और, अरे ..., कि यह वास्तव में है। : - $?
करता columnDefinition ही एनोटेशन में उपलब्ध कराई गई अन्य संपत्तियों को ओवरराइड?
जावाडोक और जेपीए स्पेक इस बात को संबोधित नहीं करते हैं - कल्पना महान सुरक्षा नहीं दे रही है। 100% सुनिश्चित करने के लिए, अपने चुने हुए कार्यान्वयन के साथ परीक्षण करें।
निम्नलिखित सुरक्षित रूप से जेपीए कल्पना में दिए गए उदाहरणों से गर्भित किया जा सकता है
name
& table
columnDefinition
साथ संयोजन के रूप में इस्तेमाल किया जा सकता है, न तो
nullable
अधिरोहित कर रहे हैं ओवरराइड की गई है/निरर्थक बना दिया columnDefinition
निम्नलिखित "स्थिति के तर्क" से काफी सुरक्षित रूप से निहित किया जा सकता है (क्या मैंने बस यह कहा था ?? :-P):
length
, precision
, scale
अधिरोहित/columnDefinition
द्वारा अनावश्यक बना रहे हैं - वे प्रकार
insertable
और updateable
अलग है और कभी नहीं प्रदान की जाती हैं columnDefinition
में शामिल का अभिन्न अंग हैं, क्योंकि डेटाबेस में उत्सर्जित होने से पहले, वे एसक्यूएल पीढ़ी इन-मेमोरी को नियंत्रित करते हैं।
यह केवल "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/विशिष्टता है
- वैकल्पिक रूप से, जेपीए डालें & अद्यतन: पूर्व में कॉलम ए शामिल होना चाहिए , बाद के कॉलम बी
स्रोत
2013-07-05 06:09:32
यदि आप इसे निर्दिष्ट करने जा रहे हैं तो सटीक कॉलम आपके डेटाबेस में बनाया जाएगा अन्यथा यह डेटाबेस –
के अनुसार डिफ़ॉल्ट रूप से बनाया जाएगा, मुझे यह जोड़ना चाहिए कि अब मैं इस संपत्ति का उपयोग नहीं करता हूं, और अपना खुद का डीडीएल करना पसंद करते हैं। –