2010-01-29 20 views
35

मेरी MySQL डेटाबेस में, वहाँ कॉलम "लिंग enum ('पुरुष', 'औरत')"Enum, एक enum में अब भी मौजूद

मैं अपने enum "com.mydomain.myapp.enums बनाया है, जिसका लिंग ", और मेरे Person इकाई में मुझे" लिंग लिंग "परिभाषित किया गया है।

अब मैं अपने MySQL डेटाबेस में enum प्रकार रखना चाहते हैं, लेकिन जब मैं अपने आवेदन शुरू मैं:

गलत स्तंभ प्रकार MyApp.Person में स्तंभ लिंग के लिए। मिल गया: enum, उम्मीद: पूर्णांक

ऐसा क्यों है? यह बराबर होगा जैसे कि मैंने "लिंग लिंग" को "@Enumerated (EnumType.ORDINAL)" के साथ एनोटेट किया होगा, जो मैंने नहीं किया है। EnumType केवल ORDINAL या STRING होने में सक्षम होने के लिए प्रतीत होता है, तो मैं यह कैसे निर्दिष्ट करूं कि इसे क्षेत्र को एक enum के रूप में नहीं करना चाहिए, int के रूप में नहीं? (कि नहीं वहाँ बहुत अंतर है, लेकिन पर्याप्त यह इसके बारे में परेशान हो जाता करने के लिए है।)

+0

भेजने पूर्णांकों काम shud।पुरुष = 1, मादा = 2 – Cherian

+0

हाइबरनेट का उपयोग करके, आप कैसे सुझाव देंगे कि मैं अपनी इकाई वर्ग को ऐसा करने के लिए एनोटेट करता हूं? मैंने अपने एनम मूल्यों को स्पष्ट रूप से परिभाषित करने का प्रयास किया है "सार्वजनिक enum लिंग (MALE (1), FEMALE (2);}" त्रुटि आउटपुट – niklassaers

उत्तर

23

मेरे समझ है कि MySQL enum प्रकार बहुत मालिकाना और अच्छी तरह से हाइबरनेट द्वारा समर्थित नहीं है, गेविन राजा से this comment देखते हैं (इस संबंधी समस्या एक है थोड़ा अलग लेकिन यह महत्वपूर्ण हिस्सा नहीं है)।

तो, मैं वास्तव में लगता है कि आप अपने खुद के UsereType का उपयोग करना होगा और मैं लचीला समाधान का उपयोग करने की सलाह देते हैं - Java 5 EnumUserType से काम कर संस्करण (देखें Appfuse के Java 5 Enums Persistence with Hibernate एक उदाहरण के लिए)।

व्यक्तिगत रूप से, मैं केवल MySQL enum का उपयोग करने के विचार को भूल जाऊंगा, मुझे विश्वास नहीं है कि "लाभ" इसके लायक हैं (अधिक जानकारी के लिए this answer देखें)।

18

@Enumerated (EnumType.STRING) का उपयोग करते हैं और इस

enum Gender { 
    male, 
    female 
} 

नोट लोअर केस मूल्यों की तरह अपने enum परिभाषित करने के लिए प्रयास करें।

यह कम से कम VARCHAR कॉलम के साथ काम करेंगे। यह enum को स्ट्रिंग 'नर' या 'मादा' के रूप में स्टोर करेगा।

+2

में कोई फर्क नहीं पड़ता के रूप में, मैं enum टाइप कॉलम का उपयोग कर रहा हूं, varchar – niklassaers

+4

क्या आप वास्तव में नहीं हैं मेरे सुझाव की कोशिश की? mysql में लिंग प्रकार शायद एक वर्चर या चार कॉलम के आसपास कुछ लपेटने/वाक्य रचनात्मक चीनी है। –

23

आप एक स्तंभ परिभाषा हाइबरनेट देते हैं, यह एक अनुमान लगाने का प्रयास नहीं करेगा:

@Column(columnDefinition = "enum('MALE','FEMALE')") 
@Enumerated(EnumType.STRING) 
private Gender gender; 

आप किसी भी कारण से अपने स्कीमा उत्पन्न करने के लिए हाइबरनेट पर भरोसा नहीं कर रहे हैं, तो आप भी नहीं है कॉलम परिभाषा के लिए वास्तविक मूल्य प्रदान करने के लिए। इस तरह, आप एक उदाहरण हटाते हैं जहां आपको मानों को सिंक में रखने की आवश्यकता होती है। बस सिंक में अपने जावा enum और अपने Liquibase या SQL स्क्रिप्ट रखें:

@Column(columnDefinition = "enum('DUMMY')") 
@Enumerated(EnumType.STRING) 
private ManyValuedEnum manyValuedEnum; 
3
नहीं इस मामले के लिए

लेकिन अगर किसी एक्सएमएल मानचित्रण का उपयोग किया जाता है:

<property name="state" column="state" not-null="true"> 
    <type name="org.hibernate.type.EnumType"> 
    <param name="enumClass">com.myorg.persistence.data.State</param> 
    </type> 
</property> 

डेटाबेस स्तंभ प्रकार संख्यात्मक जैसे होना चाहिए सामान्य नियमों को पढ़ने के लिए एक mysql पर tinyint संभव है।

5

नहीं यकीन है कि क्यों नहीं हाइबरनेट प्रलेखन में है, लेकिन आप क्या कर सकते हैं इस

<property name="type" column="type" not-null="true"> 
    <type name="org.hibernate.type.EnumType"> 
     <param name="enumClass">com.a.b.MyEnum</param> 
     <param name="type">12</param> 
     <!-- 12 is java.sql.Types.VARCHAR --> 
    </type> 
</property> 
+0

Thx, यह एक MySQL ENUM कॉलम के साथ ठीक काम करता है, हालांकि 12 VARCHAR – arun

+0

के लिए यह है एनोटेशन के साथ यह कैसे करें? – rajadilipkolli