2010-09-15 12 views
5

के रूप में enum का उपयोग जेपीए का उपयोग करके, क्या हम एक इकाई के आईडी के रूप में एक enum परिभाषित कर सकते हैं?आईडी

मैं कोशिश की है निम्नलिखित:

public enum AssetType { 
    .... 
} 

@Entity 
@IdClass(AssetType.class) 
public class Adkeys { 

    private AssetType type; 

    @Id 
    @Enumerated(EnumType.STRING) 
    @Column(nullable = false) 
    public AssetType getType() { 
     return type; 
    } 

} 

OpenJPA का उपयोग करना, यह शिकायत:

org.apache.openjpa.persistence.ArgumentException: आईडी वर्ग "वर्ग aa.AssetType" निर्दिष्ट टाइप करें "क्लास aa.Adkeys" में सार्वजनिक नो-Args कन्स्ट्रक्टर नहीं है।

तो मेरी प्रश्न हैं:

  • हम जेपीए पर एक इकाई के लिए आईडी के रूप में enum उपयोग करने में सक्षम होना चाहिए? (यानी ओपनजेपीए में एक बग है)
  • या क्या मैं कहीं गलती करता हूं?
  • और क्या ऐसी समस्या के लिए कोई कामकाज है?
+0

@Nathan: तो फिर यह एक बग होना चाहिए। –

उत्तर

7

जेपीए कल्पना कहना नहीं है यह संभव है:

2.1.4 प्राथमिक कुंजी और इकाई पहचान

प्राथमिक कुंजी (या क्षेत्र या एक समग्र प्राथमिक कुंजी की संपत्ति) होना चाहिए निम्न प्रकारों में से एक बनें: किसी भी जावा आदिम प्रकार; कोई आदिम रैपर प्रकार; java.lang.String; java.util.Date; java.sql.Date। सामान्य रूप से, हालांकि अनुमानित संख्यात्मक प्रकार (उदा।, फ़्लोटिंग पॉइंट प्रकार) का उपयोग प्राथमिक कुंजी में कभी नहीं किया जाना चाहिए। जिन संस्थाओं की प्राथमिक कुंजी इनके अलावा अन्य प्रकारों का उपयोग पोर्टेबल नहीं होगी।

तुम सच में एक संकलन समय किसी दिए गए इकाई के लिए अभिलेखों की संख्या तय करना चाहते हैं, तो आप एक String या int प्राथमिक कुंजी का उपयोग करें और आवंटित यह AssetType.FOO.name() या AssetType.FOO.ordinal()

और गैर पोर्टेबल यहाँ साधन कर सकते हैं कि कुछ दृढ़ता प्रदाता अन्य चीजों का समर्थन कर सकते हैं, लेकिन यह किसी अन्य प्रदाता के लिए काम नहीं कर सकता है। Enum के साथ - अगर दृढ़ता प्रदाता के लिए इसके लिए विशेष समर्थन है, तो यह इसे चालू करने की कोशिश नहीं करता है, बल्कि class.isEnum() की जांच के बाद विशेष रूप से इसे संसाधित करता है, तो यह काम कर सकता है। लेकिन ऐसा लगता है कि आपका दृढ़ता प्रदाता ऐसा नहीं करता है।

+0

यह नहीं कहता कि यह संभव है लेकिन यह नहीं कहता कि यह असंभव है। यह सिर्फ कहता है: 'जिन संस्थाओं की प्राथमिक कुंजी इनके अलावा अन्य प्रकारों का उपयोग करती है वे पोर्टेबल नहीं होंगे'। वास्तव में, यह भी नहीं कहता कि एक वर्ग प्राथमिक कुंजी के रूप में उपयोग किया जा सकता है लेकिन यह संभव है। – nanda

+0

यह एक और बात है - एक एम्बेड करने योग्य आईडी। पोर्टेबिलिटी भाग के लिए मेरा अपडेट देखें। – Bozho

+0

तो मुझे लगता है कि यह एक वृद्धि के लिए एक वैध अनुरोध है, आपको नहीं लगता? – nanda

4

नहीं, आप आईडी के रूप में enums उपयोग नहीं कर सकते क्योंकि जेपीए आईडी कॉलम के लिए अपने स्वयं के मानचित्रण परिभाषित करने के लिए अनुमति नहीं है (वे int या long या कुछ है कि जेपीए new साथ बना सकते हैं होना चाहिए)।

आईडी व्यावसायिक कुंजी नहीं होनी चाहिए (आपके मामले में: प्रकार)। आईडी के रूप में व्यवसाय कुंजी का उपयोग करना डीबी डिज़ाइनों में एक आम गलती है और इससे बचा जाना चाहिए क्योंकि इससे बाद में सभी प्रकार की समस्याएं पैदा हो जाएंगी।

समस्या को हल करने के लिए एक स्वतंत्र आईडी कॉलम जोड़ें।

+0

मैं पुराने डेटाबेस के साथ काम कर रहा हूं। यह अच्छा डिजाइन नहीं हो सकता है लेकिन यह वहां है। Enum सिर्फ कठोर मूल्य का एक गुच्छा है। – nanda

0

क्या आप वाकई ऐसा करना चाहते हैं? यह निर्माण कोड में enum को अद्यतन किए बिना डेटाबेस एनम कुंजी को बदलने की अनुमति नहीं देता है (लोड पर असफल), न ही दूसरी तरफ (बाधा विफलता)। आप केवल int pk और name के साथ एसेट टाइप टाइप क्यों नहीं बनाते हैं, और एडीटी को एपीटी टाइप टाइप को पीके के रूप में एक विदेशी कुंजी बनाते हैं?

यदि आप उन्हें अपने ऐप में गणना करने की आवश्यकता है तो आप स्टार्टअप पर डीबी से एसेट टाइप टाइप कर सकते हैं।

+0

मैं पुराने डेटाबेस के साथ काम कर रहा हूं। बेशक मैं इसे बदल सकता हूं लेकिन यह समस्याग्रस्त हो सकता है। Enum सिर्फ कठोर मूल्य का एक गुच्छा है। – nanda