2010-05-20 3 views
47

जेपीए में कॉलम पर लंबाई निर्धारित करने में वास्तव में क्या होता है?@ कॉलम जेपीए एनंटेशन पर सेट करते समय लंबाई विशेषता क्या करती है?

@Column(name = "middle_name", nullable = false, length = 32) 
public String getMiddleName() { 
    return this.middleName; 
} 

मैं समझता हूँ कि आप व्याख्या का उपयोग कर सकते हैं डेटाबेस स्कीमा (DDL) इकाई वस्तुओं के आधार पर उत्पन्न करने के लिए है, लेकिन लंबाई के चेक या काट-छांट किसी भी प्रकार का क्या करता है जब हठ होता है, या यह केवल स्कीमा निर्माण के लिए इस्तेमाल किया ?

मुझे यह भी एहसास है कि जेपीए विभिन्न कार्यान्वयन के शीर्ष पर बैठ सकता है, इस मामले में जो कार्यान्वयन मैं चिंतित हूं, वह हाइबरनेट है।

उत्तर

67

क्या दृढ़ता होने पर लंबाई किसी भी प्रकार की जांच या छंटनी होती है, या यह पूरी तरह से स्कीमा निर्माण के लिए उपयोग की जाती है?

Column एनोटेशन के length विशेषता निर्दिष्ट करने के लिए प्रयोग किया जाता है:

स्तंभ लंबाई। (केवल तभी लागू होता है जब एक स्ट्रिंग-मूल्यवान कॉलम का उपयोग किया जाता है।)

और केवल जेनरेट डीडीएल में उपयोग किया जाता है। आपके उदाहरण में, परिणामी कॉलम VARCHAR(32) के रूप में उत्पन्न किया जाएगा और एक लंबी स्ट्रिंग डालने का प्रयास करने से SQL त्रुटि हो जाएगी।


सत्यापन के लिए, आप बीन मान्यता एपीआई (JSR 303) से एक @Size(max=32)constraint जोड़ सकते हैं। मैंने एक रननेबल टेस्ट here के साथ एक नमूना प्रदान किया।

दोनों Size और length अनावश्यक लेकिन बीन मान्यता कल्पना की Appendix D. के अनुसार लग सकता है, बीन मान्यता अवगत DDL पैदा प्रदान हठ प्रदाताओं के लिए अनिवार्य नहीं है। इसलिए सत्यापन के लिए डीडीएल, @Size के लिए length का उपयोग करें।

यदि आप रुचि रखते हैं, तो बस जेपीए 2.0 के साथ क्लासपाथ पर बीन सत्यापन कार्यान्वयन डालें। जेपीए 1.0 के साथ, इस previous answer देखें।

+2

धन्यवाद, मुझे बहुत संदेह है। क्या आपके पास एक उद्धरण है जो कहता है कि एनोटेशन केवल डीडीएल के लिए है? मैं इसे दस्तावेज़ीकरण में स्पष्ट रूप से बता नहीं पाया। –

+1

मैंने '@ आकार (अधिकतम = 32)' और '@ कॉलम (लंबाई = 128) 'और दुर्भाग्यवश' @ आकार 'दोनों का उपयोग करने की कोशिश की है। शायद यह एक हाइबरनेट बग है। –

+1

उदाहरण के लिए जब मैं 1500 लंबाई वाला कॉलम बनाता हूं, तो इसे MySQL में "टेक्स्ट" के रूप में जेनरेट किया जाता है। इस मामले में आकार प्रतिबंध कैसे लागू होता है? या यह बिल्कुल लागू होता है? धन्यवाद। – rpr

3

@column (लंबाई = 32) केवल डीडीएल उद्देश्य के लिए है, न कि प्रतिबंधित करने के लिए इसका मतलब है कि यह 32 से अधिक वर्णों को अनुमति देता है जब तक कि तालिका स्तर पर यह प्रतिबंधित न हो। आकार को प्रतिबंधित करने के लिए हम @size (max = 32)

2

Btw, आप लंबाई निर्धारित नहीं करते हैं, तो यह 255 डिफ़ॉल्ट (MySQL के साथ परीक्षण से हो जाएगा)

2

हाइबरनेट 4.3.11 (और अन्य संस्करण) मान्यकरण एनोटेशन के लिए ध्यान देना चाहिए। - तो आप शायद

यह कर रहे हैं का हवाला देते उन्नत करने के लिए से Hibernate 4.3.11 manual

Chapter 22.Additional modules

हाइबरनेट कोर भी कुछ बाहरी मॉड्यूल/परियोजनाओं के साथ एकीकरण प्रदान करता है। इसमें हिननेट वैलिडेटर संदर्भ बीन सत्यापन (जेएसआर 303) और हाइबरनेट खोज के कार्यान्वयन को शामिल करता है।

Chapter 22.1 Bean Validation

... हाइबरनेट और बीन मान्यता के बीच एकीकरण दो स्तरों पर काम करता है। सबसे पहले, यह बाधा उल्लंघन के लिए कक्षा के इन-मेमोरी उदाहरणों को जांचने में सक्षम है। दूसरा, यह हाइबरनेट मेटामोडेल में बाधाओं को लागू कर सकता है और उन्हें उत्पन्न डेटाबेस स्कीमा में शामिल कर सकता है। ...

Chapter 22.1.4 Database schema

हाइबरनेट बीन मान्यता की कमी का उपयोग करता है एक सटीक डेटाबेस स्कीमा उत्पन्न करने के लिए:

@NotNull leads to a not null column (unless it conflicts with components or table inheritance) 

@Size.max leads to a varchar(max) definition for Strings 

@Min, @Max lead to column checks (like value <= max) 

@Digits leads to the definition of precision and scale (ever wondered which is which? It's easy now with @Digits :)) 

नोट: @Lengh, भी काम करता है की तरह @ आकार


जब आप हाइबरनेट वैलिडेटर 5.1 का उपयोग करते हैं - तो आपको एक एल-कार्यान्वयन की भी आवश्यकता होती है। उदाहरण

<dependency> 
    <groupId>org.glassfish.web</groupId> 
    <artifactId>el-impl</artifactId> 
    <version>2.2</version> 
</dependency> 

आप इस नहीं है, तो के लिए, तो हाइबरनेट ORM हाइबरनेट सत्यापन शुरू नहीं कर पाए होंगे, विज्ञापन इसलिए यह नहीं है, उदाहरण के @Length के लिए (सभी) JSR-303 ले जाएगा खाते में @Size!

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