भ्रम: @NotNull बनाम @Column (nullable = false) जेपीए और हाइबरनेट के साथ


242
  1. जब वे एक मैदान / मैदान पर उतरते हैं @Entity, तो उनमें क्या अंतर होता है? (मैं हाइबरनेट के माध्यम से इकाई को बनाए रखता हूं )।

  2. उनमें से प्रत्येक का क्या ढांचा और / या विनिर्देशन है?

  3. @NotNullके भीतर स्थित है javax.validation.constraints। में javax.validation.constraints.NotNullजावाडोक यह कहता है

    एनोटेट तत्व शून्य नहीं होना चाहिए

    लेकिन यह डेटाबेस में तत्व के प्रतिनिधित्व की बात नहीं करता है, इसलिए मैं nullable=falseकॉलम में बाधा क्यों जोड़ूंगा?

जवाबों:


328

@NotNullएक है JSR 303 बीन मान्यता एनोटेशन। इसका डेटाबेस से कोई लेना-देना नहीं है। जैसा कि हाइबरनेट JSR 303 का संदर्भ कार्यान्वयन है, हालांकि, यह समझदारी से इन बाधाओं को उठाता है और उन्हें आपके लिए डेटाबेस की कमी में बदल देता है, इसलिए आपको एक की कीमत के लिए दो मिलते हैं। @Column(nullable = false)स्तम्भ को शून्य घोषित करने का जेपीए तरीका है। यानी पूर्व सत्यापन के लिए इरादा है और डेटाबेस स्कीमा विवरण को इंगित करने के लिए उत्तरार्द्ध है। आप सत्यापन एनोटेशन पर हाइबरनेट से कुछ अतिरिक्त (और स्वागत!) मदद कर रहे हैं।


2
धन्यवाद! इसलिए अगर मैं चाहता हूं कि मेरी जेपीए की दृढ़ता हाइबरनेट कार्यान्वयन (यानी ईजेबी 3 में परिवर्तन) से बंधे नहीं है, तो मुझे दोनों एनोटेशन (क्षेत्र और उसके स्तंभ में दोनों को निषिद्ध करने के लिए) का उपयोग करना होगा?
रैप

3
मुझे नहीं पता। ऐसा कोई विनिर्देश नहीं है जो कहता है कि एक जेपीए प्रदाता को जेएसआर 303 एनोटेशन को पहचानना चाहिए, लेकिन इसका मतलब यह नहीं है कि अन्य प्रदाता नहीं करते हैं। मैं यह नहीं कह सकता कि कोई करता है या नहीं।
रयान स्टीवर्ट

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

5
@ शाजेब: सवाल यह नहीं है कि कौन जेएसआर 303 सत्यापन का समर्थन करता है / प्रदान करता है। यह जिसके बारे में ORM (रों) पहचान JSR 303 एनोटेशन की तरह है @NotNull, @Size, @Min, @Max, आदि, और डेटाबेस की कमी में उन अनुवाद करते हैं।
रयान स्टीवर्ट

1
हां, लेकिन ओपी ने बाद की टिप्पणी में जो कुछ भी नहीं पूछा, उसके संदर्भ में मेरी टिप्पणी मान्य है।
शाहजेब

18

हाइबरनेट जेपीए प्रदाता के सबसे हालिया संस्करण सेम सत्यापन बाधाओं (जेएसआर 303) @NotNullको डीडीएल को डिफ़ॉल्ट रूप से लागू करते हैं (धन्यवाद hibernate.validator.apply_to_ddl propertyचूक के लिए धन्यवाद true)। लेकिन इस बात की कोई गारंटी नहीं है कि अन्य जेपीए प्रदाता ऐसा करने की क्षमता रखते हैं या कर सकते हैं।

आपको @NotNullयह सुनिश्चित करने के लिए बीन सत्यापन एनोटेशन का उपयोग करना चाहिए , कि बीन के गुणों को शून्य-शून्य मान पर सेट किया जाता है, जब जेवीएम में जावा बीन्स को मान्य किया जाता है (इसका डेटाबेस बाधाओं से कोई लेना-देना नहीं है, लेकिन ज्यादातर स्थितियों में उन्हें अनुरूप होना चाहिए)।

आपको अतिरिक्त रूप से JPA एनोटेशन का उपयोग करना चाहिए, जैसे @Column(nullable = false)कि जेपी प्रदाता संकेत देना चाहते हैं कि आप डेटाबेस की कमी के साथ टेबल कॉलम बनाने के लिए सही DDL उत्पन्न करें। यदि आप हाइबरनेट जैसे जेपीए प्रदाता पर भरोसा कर सकते हैं या करना चाहते हैं, जो डिफ़ॉल्ट रूप से डीडीएल के लिए सेम सत्यापन बाधाओं को लागू करता है, तो आप उन्हें छोड़ सकते हैं।


10

नोट करने के लिए दिलचस्प है, सभी स्रोत इस बात पर जोर देते हैं कि @ कॉलम (अशक्त = गलत) का उपयोग केवल डीडीएल पीढ़ी के लिए किया जाता है।

हालाँकि, यहां तक ​​कि अगर कोई @NotNull एनोटेशन नहीं है, और hibernate.check_nullability का विकल्प सही है, तो हाइबरनेट को बनाए रखने के लिए संस्थाओं का सत्यापन करेगा।

यह PropertyValueException को यह कहते हुए फेंक देगा कि "नहीं-शून्य संपत्ति एक शून्य या क्षणिक मान का संदर्भ देती है", यदि अशक्त = झूठी विशेषताओं में मान नहीं हैं, भले ही डेटाबेस परत में इस तरह के प्रतिबंध लागू नहीं होते हैं।

Hibernate.check_nullability विकल्प के बारे में अधिक जानकारी यहाँ उपलब्ध है: http://docs.jboss.org/hibernate/orm/5.0/userguide/html_single/Hibernate_User_Geride.html#configurations-mapping


7

जेपीए @Columnएनोटेशन

एनोटेशन की nullableविशेषता के @Columnदो उद्देश्य हैं:

  • इसका उपयोग स्कीमा जनरेशन टूल द्वारा किया जाता है
  • हिसरनेट द्वारा इसका इस्तेमाल पर्सिस्टेंस कॉन्सेप्ट को फ्लश करने के दौरान किया जाता है

स्कीमा जनरेशन टूल

HBM2DDL स्कीमा जेनरेशन टूल स्टेटमेंट @Column(nullable = false)विशेषता को स्टेटमेंट NOT NULLमें संबंधित तालिका स्तंभ के लिए बाधा उत्पन्न करता CREATE TABLEहै।

जैसा कि मैंने हाइबरनेट उपयोगकर्ता गाइड में समझाया है , डेटाबेस स्कीमा उत्पन्न करने के लिए HBM2DDL तंत्र पर निर्भर होने के बजाय फ्लाईवे जैसे टूल का उपयोग करना बेहतर है ।

दृढ़ता प्रसंग फ्लश

दृढ़ता प्रसंग को फ्लशिंग करते समय, हाइबरनेट ORM भी @Column(nullable = false)इकाई विशेषता का उपयोग करता है :

new Nullability( session ).checkNullability( values, persister, true );

यदि सत्यापन विफल हो जाता है, तो हाइबरनेट एक फेंक देगा PropertyValueException, और INSERT या UPDATE स्टेटमेंट को निष्पादित करने से रोकता है:

if ( !nullability[i] && value == null ) {
    //check basic level one nullablilty
    throw new PropertyValueException(
            "not-null property references a null or transient value",
            persister.getEntityName(),
            persister.getPropertyNames()[i]
        );    
}

हाइबरनेट फ्लश तंत्र कैसे काम करता है, इस बारे में अधिक जानकारी के लिए इस लेख को देखें

द बीन वैलिडेशन @NotNullएनोटेशन

@NotNullएनोटेशन बीन मान्यता द्वारा परिभाषित और, है हाइबरनेट ORM जैसे सबसे लोकप्रिय जेपीए कार्यान्वयन, सबसे लोकप्रिय बीन मान्यता कार्यान्वयन है हाइबरनेट सत्यापनकर्ता ढांचा।

हाइबरनेट ORM के साथ हाइबरनेट वैलिडेटर का उपयोग करते समय, हाइबरनेट वैलिडेटर ConstraintViolationएंटिटी को मान्य करते समय फेंक देगा ।


आप यह क्यों कहते हैं कि स्कीमा उत्पन्न करने की तुलना में फ्लाईवे बेहतर है?
एन्ड्रॉनिकस

1
यह एक अच्छा अवलोकन है। मैंने एक संदर्भ लिंक के साथ उत्तर को अपडेट किया।
व्लाद मिहालसी

संदर्भ और शानदार उत्तर के लिए धन्यवाद!
एन्ड्रोनिकस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.