hibernate भ्रम: @NotNull बनाम @ कॉलम(शून्य=झूठा)




persistence ejb-3.0 (3)

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

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

  3. javax.validation.constraints भीतर स्थित है। javax.validation.constraints.NotNull javadoc में यह कहता है

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

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


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

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

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

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


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


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

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

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