2013-03-03 3 views
33

मेरे पास @Entity के साथ एनोटेटेड एक इकाई है।
अगर मैं CREATE TABLE स्क्रिप्ट बनाने के लिए जिम्मेदार हूँ कारण है कि मैं @Column(nullable = false) जब मैं NOT NULL खोजशब्दों के साथ डेटाबेस में एक स्तंभ बना सकते हैं निर्दिष्ट करना चाहिए? क्या कोई ऐसा उदाहरण है जो इस संपत्ति का उपयोग किसी क्षेत्र में करने के लाभ दिखाता है?मुझे @ कॉलम (nullable = false) क्यों निर्दिष्ट करना चाहिए?

उत्तर

44

बेहतर त्रुटि संदेश और त्रुटि प्रबंधन, विशेष रूप से यदि आप JSR303 @NotNull annotation भी जोड़ते हैं।

आप NOT NULL के रूप में स्तंभ बनाने लेकिन जेपीए नहीं बताया यह शून्य नहीं है, तो जेपीए कि शून्य मान ठीक हैं ग्रहण करेगा। जब आप ऑब्जेक्ट को नल के साथ सहेजने का प्रयास करते हैं, तो यह डीबी को भेजने के लिए आगे बढ़ेगा और आपको डीबी स्तर की त्रुटि मिल जाएगी। इससे डेटाबेस में लॉग स्पैम बढ़ जाता है और यह त्रुटि से निर्धारित करना बहुत कठिन होता है कि किस तालिका (कॉल) की कॉलम समस्या थी, उन्हें अकेले उन्हें अपने जेपीए नामों पर मानचित्रित करने दें।

आप उन्हें रिक्त नहीं के रूप में व्याख्या करते हैं, तो जेपीए, सहेजने से पहले एक अपवाद फेंक होगा डीबी लॉग स्पैम से बचने और आम तौर पर आप एक बेहतर त्रुटि है। विशेष रूप से, अपने जेपीए प्रदाता JSR303 समर्थन करता है तो और या तो आंतरिक रूप से @NotNull में nullable=false तब्दील हो या आप @NotNull भी जोड़ दिया है, तो यह आपको एक डेटा संरचना आप को देखने के लिए वास्तव में क्या क्या वस्तुओं के क्षेत्र क्या कारणों से निरस्त कर दिया गया जांच कर सकते हैं दे देंगे, साथ अनुकूलन टेम्पलेट त्रुटि संदेशों के साथ।

इसलिए आप जेपीए NOT NULL के बारे में खेतों में बताना चाहिए। यह, और आपके कोड पर काम करने वाले अन्य लोगों के लिए डीबी स्कीमा को पढ़ने के बिना समझना आसान है।

+1

ठीक है, लेकिन यह आपके उत्तर में अस्पष्ट है कि क्या आपको लगता है कि @NotNull और @Column (nullable = false) दोनों में एक अतिरिक्त मूल्य है। तुम क्या सोचते हो? – ymajoros

+1

@ymajoros इस बात पर निर्भर करता है कि आपका JSR303/JPA एकीकरण कितना स्मार्ट है। मैं दोनों को डालता हूं लेकिन एक अच्छा जेपीए जेएसआर 303 एकीकरण कॉलम के लिए एक अंतर्निहित नोटन जोड़ देगा जो शून्य नहीं है = झूठा –

+2

क्या उन्हें चाहिए? यदि यह कल्पना का हिस्सा नहीं है, तो मुझे नहीं पता कि क्यों और किस संदर्भ में। मैं बजाय @NotNull होगा लेकिन कोई शून्य नहीं = झूठा, क्योंकि उत्तरार्द्ध केवल jpa है। मेरा प्रश्न @ कॉलम (शून्य = झूठा) के अतिरिक्त मूल्य के बारे में अधिक है। – ymajoros

3

आपके मामले में वहाँ वास्तविक लाभ नहीं हो सकता है, लेकिन:

  • अगर आप अपने जेपीए प्रदाता का उपयोग कर रहे है (या तो Maven के माध्यम से या hbm2ddl.auto की तरह स्वत: उत्पन्न होने के माध्यम से) अपने स्कीमा उत्पन्न करने के लिए, तो यह मायने रखती है
  • यदि आप इकाई मॉडल के खिलाफ स्कीमा को सत्यापित करने के लिए अपने जेपीए प्रदाता को कॉन्फ़िगर करते हैं, तो आपको उन्हें सिंक में रहने की आवश्यकता है।
+0

पहली धारणा को अनदेखा किया जा सकता है क्योंकि 'hbm2ddl.auto' उत्पादन के लिए नहीं है और मैं अपने प्रोजेक्ट का परीक्षण मैवेन और एक प्रबंधित जेबॉस उदाहरण के साथ आर्किलियन के साथ कर रहा हूं। दूसरी बात के बारे में यह केवल मेरी स्कीमा को मान्य करने के लिए उपयोगी होगा? इस मामले में मेरा मानना ​​है कि यह जो वर्बोजिटी लाता है वह इसके लायक नहीं है, जब तक कि उनसे बेहतर कारण न हो। –

+2

आपके इकाई मॉडल और सिंक में डीबी स्कीमा होने के साथ महत्वपूर्ण है। आप अब इसका उपयोग नहीं कर सकते हैं, लेकिन बाद में आप उन टूल को जोड़ सकते हैं जिन्हें इसकी आवश्यकता है। संबंधित http://techblog.bozho.net/?p=1100 – Bozho

16

साथ ही, यदि आपके स्तंभ nullable = false में @ManyToOne एनोटेशन है, हाइबरनेट अंदरूनी संबंधित मेज पर क्वेरी में शामिल होता है। nullable = true परिणाम बाएं जॉइन में देता है।

यह अन्य अंतर है।

+0

वाह, यह कुछ अंतर्दृष्टि है। धन्यवाद। – HopeKing

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