हाइबरनेट में गणना


82

यह अक्सर एक डीएओ में एक क्षेत्र के लिए उपयोगी होता है जिसका मूल्य एक जावा गणना से आता है। एक विशिष्ट उदाहरण एक लॉगिन डीएओ है जहां आपके पास आमतौर पर एक फ़ील्ड होता है जो उपयोगकर्ता को "NORMAL" या "ADMIN" के रूप में चिह्नित करता है। हाइबरनेट में, मैं इस संबंध को निम्न (अर्ध) प्रकार के तरीके से दर्शाने के लिए 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);
}

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

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

जवाबों:


110

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

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

UserType सिर्फ एक मानक जावा 5 एनम है।

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

संपादित करें: यह एक hbm में संभव है, लेकिन थोड़ा गड़बड़ है, इस फोरम थ्रेड पर एक नज़र डालें


3
क्या @Enumerated (EnumType.ORDINAL) जो अधिक कुशल इंट को मैप कर सकता है?
ली ची कीम

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

1
मैं इन एनमों के लिए कॉलम की लंबाई कैसे बदल सकता हूं? मैंने कॉलम एनोटेशन जोड़ने की कोशिश की लेकिन वह सम्मानित नहीं हुआ?
कन्नन एकनाथ

2
आपको यह पूछने की जरूरत है कि एक और सवाल के रूप में।
गैरेथ डेविस

2
ORDINAL की बजाय STRING का उपयोग करें क्योंकि यह आपको आदेश के बावजूद Enum में अतिरिक्त तत्व जोड़ने की अनुमति देता है।
मैथ्यू डूमेन

14

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

आप अपने प्रत्येक एनम के लिए एक नया टाइपफ़ाइफ़ बना सकते हैं और प्रॉपर्टी टैग में टाइपफ़ीड को संदर्भित कर सकते हैं।

उदाहरण मानचित्रण - इनलाइन <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>

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

1
ध्यान दें कि नए संस्करणों में enumClassइसके बजाय पैरामीटर नाम है enumClassName
रयान रन्सफोर्ड
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.