2011-01-14 13 views
6

का उपयोग कर कच्चे जावा एनम पर बने रहें मेरे पास एक ऐसी इकाई है जिसमें एक enum संपत्ति है।हाइबरनेट

public enum AutomobileType { 
    CAR, TRUCK, MOTORCYCLE 
} 

public enum BoatType { 
    ROW_BOAT,YACHT,SHIP 
} 

@Entity 
public class FooBar { 

    @Enumerated(value=EnumType.ORDINAL) 
    private Enum enumValue; 

    public void setEnumValue(Enum value) { ... } 
    public Enum getEnumValue() { ... } 
} 

यह एक अपवाद है, "गलत डेटा प्रकार: इनपुट स्ट्रिंग के लिए:" के साथ विफल:। [बी @ f0569a "मैं स्टोर करने के लिए FooBar बदल कि संपत्ति मेरी codebase में Enums की मेरी प्रकारों में से किसी एक हो सकता है एक पूर्णांक जो काम करता है, लेकिन यह है कि मैं क्या जरूरत है। मैं वास्तविक enum की जरूरत है। यह कैसे काम करने के लिए इतना है कि enum पूर्णांक के रूप में कायम किया जा सकता है, लेकिन बाद में सही enum प्रकार में बाहर निकाला पर कोई सुझाव नहीं है के रूप में संपत्ति?

+0

"इस काम को कैसे बनाया जाए इस पर कोई सुझाव है कि एनम को int के रूप में जारी रखा जा सकता है लेकिन बाद में सही एनम प्रकार में खींचा जा सकता है?" - आपका मतलब है, आप "1" स्टोर करना चाहते हैं और फिर इसे ऑटोमोबाइल टाइप के रूप में वापस लेना चाहते हैं? – jpkrohling

उत्तर

3

आपको एनम के लिए custom UserType परिभाषित करने की आवश्यकता है।

+0

यह जेपीए पर लागू नहीं होता है, निश्चित रूप से, केवल एक्सएमएल-कॉन्फ़िगर किए गए हाइबरनेट के लिए। – skaffman

+0

मुझे लगता है कि यह पॉलिमॉर्फिक एनम्स के लिए एकमात्र तरीका है, हालांकि संदर्भित कोड नमूना तदनुसार संशोधित किया जाना चाहिए। – axtavt

+0

यह कुछ हद तक हास्यास्पद है कि जेपीए के पास कस्टम कॉलम/प्रॉपर्टी बाइंडिंग करने के लिए मानक नहीं है। आपको गुणों के दो सेट होने और एक सेट को क्षणिक के रूप में चिह्नित करके इकाई में इसे मैन्युअल रूप से करना होगा। –

2

आम तौर पर, आपको ऐसा नहीं करना चाहिए। यदि दो (या अधिक enums) को असाइन किया जा सकता है ओ एक ही क्षेत्र, फिर उन्हें एक गुंबद में विलय करें।

आप वंशानुक्रम का उपयोग कर रहे हैं, जैसे: दो उपवर्गों साथ Vehicle - Boat और Car तो आपको प्रत्येक उपवर्ग में एक अलग क्षेत्र हो सकता है - के बाद इन enums के सभी प्रत्येक केवल विशेष प्रकार के लिए प्रासंगिक है। तो:

@Column 
private BoatType boatType; 
+0

यह करने का यह सही तरीका है। :) –

+0

@ बोझो: वह एक ही संपत्ति में विभिन्न enums स्टोर करना चाहता है। – axtavt

+0

मुझे लगता है कि ओपी का मतलब है कि वह वास्तव में एक विशिष्ट enum प्रकार के बजाय एक polymorphic 'Enum' का उपयोग करना चाहता है। – skaffman

0

मुझे नहीं लगता कि यह एक ही संपत्ति में सह-अस्तित्व में रहने की कोशिश कर रहे कई एनम प्रकारों के साथ आसानी से काम कर सकता है। हाइबरनेट कैसे पता लगाता है कि डीबी से बाहर क्षेत्र को लोड करते समय एनम क्लास को तुरंत चालू करना चाहिए?

यदि आप वास्तव में ऐसा करना चाहते हैं तो आपको हर बार इस संपत्ति को बनाए रखने के लिए एनम क्लास + मूल्य को एन्कोड करना होगा (डफिमो सुझाव के रूप में एक कस्टम उपयोगकर्ता टाइप का उपयोग करें)।

क्या आप इसे दो प्रोपर्टीज़ में विभाजित नहीं कर सकते हैं, प्रति एनम कक्षा में? फिर आप सही कक्षा के रूप में enumValue (और enumValue2) घोषित कर सकते हैं और यह बॉक्स से बाहर काम करेगा।