जेपीए में @Basic (वैकल्पिक = गलत) बनाम @ कॉलम (अशक्त = गलत)


103

बीच क्या अंतर है @Basic(optional = false)और @Column(nullable = false)जेपीए हठ में?



14
वास्तव में डुप्लिकेट नहीं है, सवाल विशेषताओं के बारे में अधिक है, एनोटेशन नहीं।
पास्कल थिवेंट

हो सकता है इसे और अधिक मदद stackoverflow.com/a/59497054/6191407
सोनू पटेल

जवाबों:


98

गॉर्डन यॉर्के (एक्लिप्स आर्किटेक्चर कमेटी मेंबर, टॉपलिंक कोर टेक्निकल लीड, जेपीए 2.0 एक्सपर्ट ग्रुप मेंबर) ने इस विषय पर एक अच्छा उत्तर लिखा है, इसलिए उसे पैराफ्रेस करने के बजाय, मैं उसका उत्तर उद्धृत करूंगा :

के बीच का अंतर optionalऔर nullableवह दायरा है जिस पर उनका मूल्यांकन किया जाता है। optionalसंपत्ति और क्षेत्र के मूल्यों के बारे में ' ' की परिभाषा बताती है और सुझाव देती है कि इस सुविधा का मूल्यांकन रनटाइम के भीतर किया जाना चाहिए। ' nullable' केवल डेटाबेस कॉलम के संदर्भ में है।

यदि कोई कार्यान्वयन लागू करना चुनता है, optionalतो उन संपत्तियों को पर्सिस्टेंस प्रदाता द्वारा मेमोरी में मूल्यांकन किया जाना चाहिए और SQL से पहले उठाए गए एक अपवाद को डेटाबेस में भेज दिया जाता है अन्यथा ' updatable=false' ' optional' उल्लंघनों का उपयोग करते समय कभी भी रिपोर्ट नहीं की जाएगी।


8
तो, जो वास्तव में इस्तेमाल किया जाना चाहिए, शायद दोनों?
क्ले जेली 13

39
@ ज़ीली: पुस्तक से: हाइबरनेट 2007 के साथ जावा दृढ़ता, पी। 179: @Basic(optional = false) @Column(nullable = false)@Basic एनोटेशन संपत्ति को जावा ऑब्जेक्ट स्तर पर वैकल्पिक नहीं के रूप में चिह्नित करता है। कॉलम मैपिंग पर दूसरी सेटिंग, nullable = false, केवल एक NOT NULL डेटाबेस बाधा उत्पन्न करने के लिए जिम्मेदार है। हाइबरनेट जेपीए कार्यान्वयन किसी भी मामले में दोनों विकल्पों को एक ही तरह से व्यवहार करता है, इसलिए आप इस उद्देश्य के लिए केवल एक एनोटेशन का उपयोग कर सकते हैं।
अचेत

2
@ रैप - मुझे समझ नहीं आता The @Basic annotation marks the property as not optional on the Java object level.कि इसका क्या मतलब है? तो, केवल @Basicयह कहने जैसा है कि NOT NULLउक्त चर के लिए डेटाबेस कॉलम बनाएं ?
एरान मोराद

9
इसका मतलब है, यदि आप एक इकाई को एक अशक्त क्षेत्र के साथ बनाए रखने की कोशिश करते हैं, तो यह एक अपवाद फेंक देगा यदि इसे वैकल्पिक = गलत (डेटाबेस से संपर्क किए बिना) के रूप में चिह्नित किया जाए और इकाई को जेपीए दृढ़ता संदर्भ में नहीं जोड़ा जाएगा। यदि यह केवल अशक्त होने के लिए एनोटेट किया गया है = झूठी अस्तित्व के संदर्भ में इकाई को जोड़ा जाएगा और जब डेटाबेस को इकाई को लिखने की कोशिश की जाएगी (उदाहरण के लिए फ्लश के माध्यम से) तो वह उस डेटाबेस को इकाई लिखने की कोशिश करेगा जो इससे इनकार करेगा यह तब एक अपवाद फेंक देगा।
रे हुलहा

@RayHulha मैंने "@Basic (वैकल्पिक = गलत)" के साथ एक फ़ील्ड एनोटेट करने की कोशिश की, और मैंने डेटाबेस में एक टपल जोड़ा (इस फ़ील्ड के मूल्य के साथ = अशक्त), कोई अपवाद नहीं उठाया गया !!, मुझे आशा है कि आप समझा सकते हैं मेरे इस व्यवहार के लिए।
ziMtyth

4

इसलिए मैंने JPA 2.1 (EclipseLink) का उपयोग करके @Basic (वैकल्पिक = गलत) एनोटेशन की कोशिश की और यह पता चला कि एनोटेशन को वास्तविक उपयोग (कम से कम एक स्ट्रिंग फ़ील्ड के लिए) में अनदेखा किया गया है। (उदा .ManManager.persist कॉल्स)।

इसलिए मैं विनिर्देश पर गया और इसके बारे में पढ़ा। यहाँ क्या कहना है कल्पना है:
http://download.oracle.com/otndocs/jcp/persistence-2.0-fr-oth-JSpec/

मूल (वैकल्पिक): चाहे क्षेत्र या संपत्ति का मूल्य शून्य हो सकता है। यह एक संकेत है और आदिम प्रकारों के लिए अवहेलना है; इसका उपयोग स्कीमा पीढ़ी में किया जा सकता है।

इसलिए मुझे लगता है कि यह वाक्य मूल (वैकल्पिक) के लिए वास्तविक उपयोग के मामले को समझाता है जो स्कीमा पीढ़ी में उपयोग किया जाता है। (वह यह है: जब आप जावा इकाई वर्गों से सृजन योग्य SQL उत्पन्न करते हैं। यह कुछ हाइबरनेट उदाहरण के लिए कर सकता है।)


1
यह मजेदार है कि अन्य उत्तर का तात्पर्य है कि यह अशक्त है और बेसिक नहीं है जो स्कीमा पीढ़ी के लिए उपयोग किया जाता है (जब यह कहता है कि "'अशक्त' केवल डेटाबेस कॉलम» के संदर्भ में है)। यह अभी भी बहुत भ्रामक है। मुझे लगता है कि स्कीमा पीढ़ी के लिए अशक्त का उपयोग किया जाता है और बेसिक (वैकल्पिक = गलत) का उपयोग उसी उद्देश्य के लिए किया जा सकता है? क्या इसका कोई मतलब है?
मार्कस

optional = falseकेवल इस बाधा की जाँच करने के लिए है। nullable = falseडेटाबेस बाधा बनाता है। अनुप्रयोगों के लिए, यह भी optional = falseसमझ में आता है, क्योंकि यह डेटाबेस में जाने की तुलना में तेजी से मूल्यांकन किया जाता है और उस बाधा की जांच करता है ..
nimo23
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.