2009-01-06 10 views
82

में गणनाएं अक्सर डीएओ में एक फ़ील्ड रखने के लिए उपयोगी होती हैं जिसका मूल्य जावा गणना से आता है। एक सामान्य उदाहरण एक लॉगिन डीएओ है जहां आपके पास आमतौर पर ऐसा क्षेत्र होता है जो उपयोगकर्ता को "सामान्य" या "एडमिन" के रूप में दर्शाता है। हाइबरनेट में, मैं एक (अर्ध) typesafe तरीके से इस संबंध का प्रतिनिधित्व करने के लिए निम्न 2 वस्तुओं का प्रयोग करेंगे:हाइबरनेट

class User { 
    String username; 
    String passwd; 
    UserType type; 
} 

class UserType { 
    private enum Type {ADMIN, NORMAL}; 
    private String type; 

    //Setters/Getters for Hibernate 
    public void setType(String type); 
    public String getType(); 

    //Setters/Getters for user 
    public void setUserType(UserType.Type t); 
    public UserType.Type getUserType(); 

    public static UserType fromType(UserType.Type t); 
} 

यह काम करता है, लेकिन मैं प्रयोक्ता प्रकार वर्ग ungly और सिर्फ एक जोड़े को स्टोर करने के लिए बहुत ज्यादा नौकरशाही की आवश्यकता होती है लगता है मूल्यों का आदर्श रूप में, हाइबरनेट को सीधे enum फ़ील्ड का समर्थन करना चाहिए और गणना मूल्यों को संग्रहीत करने के लिए एक अतिरिक्त तालिका तैयार करना चाहिए।

मेरा प्रश्न है: क्या हाइबरनेट में एक गणित वर्ग को सीधे मैप करने का कोई तरीका है? यदि नहीं, तो क्या समीकरणों का प्रतिनिधित्व करने के लिए मेरा पैटर्न पर्याप्त है या क्या मुझे कुछ याद आ रहा है? लोग किस अन्य पैटर्न का उपयोग करते हैं?

उत्तर

110

का उपयोग कर हाइबरनेट या जेपीए एनोटेशन का उपयोग:

class User { 
    @Enumerated(EnumType.STRING) 
    UserType type 
} 

प्रयोक्ता प्रकार सिर्फ एक मानक जावा 5 enum है ।

मैं कल्पना नहीं कर सकता कि यह सिर्फ एनोटेशन तक सीमित है लेकिन मुझे वास्तव में यह नहीं पता कि एचबीएम फाइलों के साथ इसे कैसे किया जाए। यह बहुत संस्करण निर्भर हो सकता है, मैं अनुमान लगा रहा हूं लेकिन मुझे पूरा यकीन है कि 3.2+ हाइबरनेट आवश्यक है।

संपादित करें: यह एक HBM में संभव है, लेकिन थोड़ा जटिल होता है, पर इस forum thread

+3

@Enumerated (EnumType.ORDINAL) जो अधिक कुशलता से मानचित्र के लिए मानचित्र कर सकते हैं? –

+4

संभावित रूप से अधिक कुशल है, लेकिन मैं वास्तविक प्रणाली में अंतर को मापने में सक्षम नहीं होने पर पैसे डालूंगा। EnumType.ORDINAL वास्तव में डिफ़ॉल्ट है यदि आप अभी @Enumerated करते हैं। मुझे लगता है कि ज्यादातर लोग (एएसपी डीबीए) डीबी में enum नाम पसंद करते हैं। –

+1

मैं इन enums के लिए कॉलम लंबाई कैसे बदल सकता हूँ? मैंने कॉलम एनोटेशन जोड़ने की कोशिश की लेकिन उसे सम्मानित नहीं किया गया? –

15

हाइबरनेट प्रलेखन से: http://www.hibernate.org/272.html

आप अपने enums से प्रत्येक के लिए एक नया typedef बना सकते हैं और संपत्ति टैग में typedefs संदर्भित कर सकते हैं।

उदाहरण मानचित्रण - इनलाइन <type> टैग

<property name='suit'> 
    <type name="EnumUserType"> 
     <param name="enumClassName">com.company.project.Suit</param> 
    </type> 
    </property> 

उदाहरण मानचित्रण - <typedef>

<typedef name="suit" class='EnumUserType'> 
     <param name="enumClassName">com.company.project.Suit</param> 
    </typedef> 

    <class ...> 
    <property name='suit' type='suit'/> 
    </class> 
+0

धन्यवाद एक नजर है। मैं पहले से ही उस समाधान से अवगत था। समस्या यह है कि यह आपके सभी enums को हाइबरनेट-आंतरिक प्रकारों का उपयोग करने की आवश्यकता है, जो आपके मामले में डीटीओ के रूप में डीएओ के रूप में उपयोग कर रहे हैं, जिसके परिणामस्वरूप समस्याएं हो सकती हैं। वास्तव में एक बेहतर समाधान वास्तव में वर्णित है: http://www.hibernate.org/273.html –

+1

ध्यान दें कि नए संस्करणों में पैरामीटर नाम 'enumClassName' के बजाय' enumClass' है। –