2010-08-01 12 views
36

यहाँ के बजाय बूलियन के लिए मेरे JPA2/हाइबरनेट परिभाषा है:हाइबरनेट जेपीए, MySQL और TINYINT (1) बिट या चार

Code: 
@Column(nullable = false) 
private boolean enabled; 

MySQL में इस स्तंभ एक सा (1) डेटाप्रकार के लिए हल हो गई है - जो करता है मेरे लिए काम नहीं करो विरासत के मुद्दों के लिए मुझे बूलियन को एक छोटे से छोटे रंग में मैप करने की आवश्यकता नहीं है। लेकिन मुझे डिफ़ॉल्ट डेटाटाइप बदलने की संभावना नहीं दिख रही है। क्या वहाँ कोई?

उत्तर

31

NumericBooleanType आज़माएं। तो आप का उपयोग करना होगा किसी कारण के लिए यह एक घोषित लघु प्रकार नाम नहीं है:

@Column(nullable = false) 
@Type(type = "org.hibernate.type.NumericBooleanType") 
private boolean enabled; 

यह करता है एक पूर्णांक प्रकार के लिए नक्शे लेकिन यह शायद एक TINYINT के साथ ठीक से काम करेगा।

अद्यतन: org.hibernate.type.NumericBooleanType कुछ आरडीबीएमएस में टिन्यिनट के साथ काम करता है। डेटाबेस स्तंभ प्रकार INTEGER पर स्विच करें। या उपयुक्त के रूप में एक अलग जावा @ टाइप मूल्य, या कॉलम परिभाषा का उपयोग करें।

इस उदाहरण में, @Column(nullable = false, columnDefinition = "TINYINT(1)") का दोस्त का उत्तर किसी भी डेटाबेस परिवर्तन के बिना काम करेगा।

+0

ठीक काम करता है, लेकिन बिट (1) int – zaletniy

+0

-1 को बदलने के बाद, लेकिन केवल इसलिए कि @Dude उत्तर बेहतर है। – Johan

+0

क्या यह एक बूलियन ओबेट के साथ भी काम करता है? – Rafael

48

@ टाइप एनोटेशन एक हाइबरनेट एनोटेशन है।

पूर्ण JPA2 में, जिस तरह से बीआईटी (1) के बजाय (1) एसक्यूएल प्रकार एक TINYINT को एक बूलियन क्षेत्र मैप करने के लिए (हाइबरनेट 3.6+ के साथ), columnDefinition विशेषता का उपयोग करने के लिए है।

@Column(nullable = false, columnDefinition = "TINYINT(1)") 
private boolean enabled; 

एनबी: इस मामले में लंबाई विशेषता का कोई प्रभाव नहीं पड़ता है, तो हम (1) वाक्यविन्यास का उपयोग करते हैं। = False

Wrong column type Found: bit, expected: TINYINT(1) 

ऐसा लगता है इस मामले में, अपने एक ही रास्ता tinyInt1isBit उपयोग करने के लिए है कि:


हाइबरनेट 4.0+ के साथ, वाक्य रचना के इस प्रकार इस तरह की एक रनटाइम त्रुटि पैदा कर सकता है इस तरह MySQL डेटा स्रोत कनेक्शन स्ट्रिंग में:

jdbc:mysql://server_host:3306/database?tinyInt1isBit=false 

वैसे, आप अब टी का उपयोग कर सकते वह इस तरह की लंबाई विशेषता:

@Column(nullable = false, columnDefinition = "TINYINT", length = 1) 
private boolean enabled; 
+0

आपको बहुत धन्यवाद! –

+3

चूंकि MySQL 'BOOLEAN' को' TINYINT (1) 'के रूप में उपनाम करता है, इसलिए कोई भी' कॉलमडिफिनिशन = "बुलेन" का उपयोग कर सकता है, जो थोड़ा और अधिक पठनीय हो सकता है। – eggyal

+0

आप सही हैं, आप BOOLEAN उपनाम का उपयोग MySQL के साथ भी कर सकते हैं जब तक कि उपनाम वास्तविक रूप से TINYINT पर सेट हो, जो अभी के लिए सच है। वैसे, बुलेन और टिन्यिनट मानक SQL डेटा प्रकार दोनों नहीं हैं, इसलिए यदि आप अपना डेटा प्रदाता बोली (उदा: ओरेकल) बदलते हैं तो आप विफलता का जोखिम लेते हैं। – Donatello

1

मैं इस त्रुटि थी:

Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sessionFactory' defined in ServletContext resource [/WEB-INF/config/context-config.xml]: Invocation of init method failed; nested exception is org.hibernate.MappingException: Could not determine type for: org.hibernate.type.NumericBooleanType, at table: bookingItem, for columns: [org.hibernate.mapping.Column(enabled)]

और यह मेरे लिए काम किया: स्प्रिंग डेटा/हाइबरनेट 5.0 के साथ

@Column(nullable = false, columnDefinition = "TINYINT(1)") 
private boolean enabled; 
1

मैं जेपीए उपयोग कर रहा हूँ एक MySQL डेटाबेस।

मेरी इकाई वस्तु में, मैं निम्नलिखित डाल:

@Column(name = "column_name", columnDefinition = "BOOLEAN") 
private Boolean variableName; 

मेरे देव वातावरण हाइबरनेट ऑटो DDL अद्यतन करने के लिए सेट है, इसलिए जब मैं देव को तैनात किया है, यह तालिका प्रकार tinyint का स्तंभ के साथ बनाया (1)।

मेरा कॉलम जो इस कॉलम का उपयोग करता है वह शून्य के रूप में शून्य मानता है, इसलिए मैं नल के बारे में चिंतित नहीं हूं, अगर आप हैं, तो आप इसे एक प्राथमिक बूलियन बना सकते हैं या कॉलम एनोटेशन में ", नलबल = झूठा" जोड़ सकते हैं।

यह समाधान पूरी तरह से जेपीए (हाइबरनेट प्रकार एनोटेशन का उपयोग नहीं करता है) और कनेक्शन स्ट्रिंग में कोई बदलाव की आवश्यकता नहीं है।

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