2012-10-22 14 views
13

मैं निम्नलिखित चरशून्य पर

@Column(columnDefinition = "bit") 
private boolean atShop; 

इस मान का उपयोग करना, मैं HSQL उपयोग कर रहा हूँ जब मैं कॉल की कोशिश आवेदन

from Person person 
left join fetch person.shop 

से इस जानकारी को पुन: प्राप्त करने के साथ एक कक्षा दुकान है बूलियन सेट नहीं कर सकता यह एचएसक्यूएल कथन मुझे निम्न त्रुटि

org.springframework.orm.hibernate3.HibernateSystemException: could not set a field value by reflection setter of com.test.dataobject.Shop.atShop; nested exception is org.hibernate.PropertyAccessException: could not set a field value by reflection setter of com.test.dataobject.Shop.atShop 

यह इसे फेंक रहा है क्योंकि यह सेट करने का प्रयास कर रहा है HSQL में शून्य करने के लिए बुलियन। मैं private Boolean atShop; को private boolean atShop; बदलकर इस समस्या को हल कर सकते हैं, लेकिन मैं एक boolean के रूप में इस रखने के लिए के रूप में मैं अपने डेटाबेस

में थोड़ा के रूप में सहेजने हूँ चाहते हैं वहाँ Boolean को boolean बदले बिना इस समस्या के समाधान के लिए एक रास्ता है?

संपादित करें:

मुझे पता है कि बूलियन केवल सही/गलत और बूलियन अशक्त करने के लिए सेट किया जा सकता है हो सकता है, लेकिन वहाँ एक रास्ता हाइबरनेट/वसंत पाने के लिए झूठी को यह मान (जो मैंने सोचा स्थापित करने के लिए है इसे स्वचालित रूप से करना चाहिए) इसे शून्य पर सेट करने और इस अपवाद को फेंकने की कोशिश करने के बजाय?

मैं भी जोड़ने स्वचालित रूप से गलत पर मूल्य निर्धारित करने के लिए एनोटेशन की कोशिश की है, लेकिन यह काम नहीं करता है या तो

@Column(nullable = false, columnDefinition = "bit default 0") 
private boolean atShop; 
+1

हाँ मुझे बूलियन और बूलियन के बीच अंतर पता है, मेरा आवेदन इस अपवाद को फेंक रहा है क्योंकि वसंत/हाइबरनेट झूठ के बजाय दुकान पर सेट करने की कोशिश कर रहा है, लेकिन मैं इसे गलत पर सेट करने के लिए कैसे प्राप्त कर सकता हूं और शून्य नहीं? –

+3

जी, मुझे इससे नफरत है जब लोग बिना किसी स्पष्टीकरण के उत्तर देते हैं और केवल इसलिए कि वे बिल्कुल वही नहीं हैं जो वे खोज रहे हैं। इस तरह के एक प्रश्न में सबसे ऊपर जो मूल रूप से पर्याप्त स्पष्ट नहीं था। यह मुझे मदद करने की कोशिश करने के लिए मेरी इच्छा खो देता है। –

+0

@ एडविन डेलोरोजो: लेकिन यह वह नहीं था जिसने जवाबों को वोट दिया, इसलिए मैंने अपने प्रश्न में संपादन खंड जोड़ा क्योंकि यह मेरी गलती थी कि मैंने यह नहीं समझा कि मैं पहले से ही बूलियन और बूलियन –

उत्तर

28

-boolean एक आदिम प्रकार है, और केवल true or false के एक मूल्य हो सकता है।

-Boolean जबकि एक आवरण वस्तु है और एक अशक्त मूल्य दिया जा सकता है।

-Java 1.5AutoBoxing से तो आप बूलियन को परिवर्तित बूलियन कर सकते हैं और वापस सरल असाइनमेंट ऑपरेटर (=) के साथ बूलियन के लिए प्रदान की जाती है, तो तुम स्थानों पर जहां आप बूलियन चाहते बूलियन के बजाय में ऐसा कर सकते हैं।

1

boolean यह हो सकता है true या false और डिफ़ॉल्ट false है आदिम है। null प्राप्त करने के लिए, यह ऑब्जेक्ट प्रकार Boolean है।

10

हाइबरनेट कोड के साथ बेवकूफ की बजाय, अपनी तालिका परिभाषा को डिफ़ॉल्ट शून्य मानों को गलत (या 0) में बदलें। इस तरह जब आप डेटाबेस से पढ़ने के लिए आते हैं यह हमेशा मान्य मान (जो है, क्योंकि यह बूलियन है, और अधिक समझ में आता है) होगा

+0

पर स्थिरता फ़ाइल में मैपिंग जोड़ सकते हैं, मैंने डिफ़ॉल्ट मान रखने के लिए तालिका में कॉलम को अपडेट करने का प्रयास किया 0 ('वैकल्पिक तालिका की दुकान ALTER COLUMN atShop बिट नल डिफॉल्ट (0) ') लेकिन मुझे अभी भी एक ही त्रुटि मिलती है –

+0

आपको शायद उन सभी मानों को ठीक करने की आवश्यकता है जिन्हें आपने वर्तमान में सहेजा है, वे शून्य होंगे। आपको कॉलम को न्यूल भी सेट करना चाहिए। – DaveRlz

+0

मैं तालिका से कॉलम को पूरी तरह से छोड़ देता हूं और इसे 'वैकल्पिक तालिका की दुकान का उपयोग करके वापस जोड़ता हूं, शॉबिट नॉट डिफॉल्ट (0)' पर और फिर भी सभी मान 0 पर सेट होते हैं और सब कुछ ठीक दिखता है त्रुटि अभी भी दिखाई दे रही है –

3

nullfalse के समान नहीं है (और न ही यह true के समान है)। null का एक बहुत ही विशिष्ट अर्थ है। यही कारण है कि हाइबरनेट ऐसा करता है जो करता है ... क्योंकि यह वास्तव में एकमात्र चीज है जो समझ में आता है, इसके बावजूद कि आपको क्या करना चाहिए।

यदि आप उन कॉलम में null का इलाज करने के लिए हाइबरनेट को निर्देश देना चाहते हैं, तो केवल वास्तविक समाधान "नल वास्तव में शून्य नहीं है" के इस विशेष उपचार के लिए एक कस्टम हाइबरनेट प्रकार मैपिंग विकसित करना है। आप इसे org.hibernate.type.Type इंटरफ़ेस, या org.hibernate.usertype.UserType इंटरफ़ेस को कार्यान्वित करके पूरा कर सकते हैं। आप सबसे अच्छा शर्त मानक बूलियन टाइप मैपिंग और बुनाई को विशेष नल हैंडलिंग में विस्तारित करना है।

हालांकि, सावधान रहना एक बात है, हालांकि, null के विरुद्ध समानता की जांच करने के बाद से पूछताछ एएनएसआई एसक्यूएल में मान्य नहीं है। यह हल करता है कि एसक्यूएल UNDEFINED कहता है, जिसका आमतौर पर FALSE का अर्थ है।

0

आप जानते हैं कि अगर आप अपवाद फेंकते हैं तो इसका मतलब है कि यह शून्य था, इसलिए इसे गलत पर सेट करें।

+0

यह काम करता है यदि आप उस कोड के नियंत्रण में हैं जहां असाइनमेंट किया गया है लेकिन इस मामले में ओपी को हाइबरनेट से मूल्य मिल रहे हैं, जो आपके लिए सभी असाइनमेंट और मैपिंग करता है, इसलिए हाइबरनेट के लिए अपने स्वयं के हैंडलर को लागू किए बिना, स्टीव एबरसोल के उत्तर में उल्लेखित, यह वास्तव में एक विकल्प नहीं है – StormeHawke

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