क्या SINGLE_TABLE विरासत रणनीति का उपयोग करते समय एक भेदभावकर्ता मूल्य के रूप में एक enum का उपयोग करना संभव है?भेदभावकर्ता मूल्य के रूप में enums का उपयोग करते हुए SINGLE_TABLE विरासत रणनीति
उत्तर
मेरी जानकारी के लिए, इस एनोटेशन के साथ संभव नहीं है:
- discriminator मान प्रकार का होना चाहिए
String
- discriminator मूल्य एक संकलन समय-निरंतर होना चाहिए, enums पर तरीकों से यानी वापसी मान हैं अनुमति नहीं हैं।
हाँ, जब आप discriminator परिभाषित टिप्पणियों का विकल्प हैं नाम और discrimatorType
@DiscriminatorColumn (name="MYDISCRIMINATOR", discriminatorType= DiscriminatorType.INTEGER)
जिनमें से DiscriminatorType केवल हो सकता है:
DiscriminatorType.STRING
DiscriminatorType.CHAR
DiscriminatorType.INTEGER
दुर्भाग्यपूर्ण है कि मैं इस कल नहीं देख पा रहे हैं, लेकिन अच्छी तरह से किया था । इस तरह यह
और ध्यान दें कि 'DiscriminatorType' डीबी प्रकार को संदर्भित करता है, न कि जावा प्रकार। 'DiscriminatorValue' अभी भी एक स्ट्रिंग के रूप में उद्धरण में एक संख्या होना चाहिए। – TWiStErRob
नहीं, दुर्भाग्य से आप नहीं कर सकते हैं।
यदि आप एक एनम को भेदभाव मूल्य के रूप में उपयोग करने का प्रयास करते हैं, तो आपको एक टाइप मिस्चैच अपवाद ("माईएनम से स्ट्रिंग में परिवर्तित नहीं किया जा सकता") मिलेगा, क्योंकि केवल भेदभावकर्ता प्रकारों को स्ट्रिंग, चार और इंटीजर की अनुमति है। अगला, मैंने क्रमशः DiscriminatorType.STRING और DiscriminatorType.INTEGER के साथ संयुक्त enum नाम और ordinal का उपयोग करने की कोशिश की। लेकिन इस, या तो काम नहीं किया के रूप में (किसी अन्य रूप में) @DiscriminatorValue एनोटेशन एक निरंतर अभिव्यक्ति की आवश्यकता है:
यह काम नहीं करता:
@Entity
@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name="FREQUENCY",
discriminatorType=DiscriminatorType.STRING
)
public abstract class Event {}
@Entity
@DiscriminatorValue(value=Frequency.WEEKLY.name())
public class WeeklyEvent extends Event {
// Exception: The value for annotation attribute DiscriminatorValue.value must be a constant expression
}
या तो काम नहीं करता:
@Entity
@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name="FREQUENCY",
discriminatorType=DiscriminatorType.INTEGER
)
public abstract class Event {}
@Entity
@DiscriminatorValue(value=Frequency.WEEKLY.ordinal())
public class WeeklyEvent extends Event {
// Exception: The value for annotation attribute DiscriminatorValue.value must be a constant expression
}
आप DiscriminatorType.INTEGER
का उपयोग कर सकते हैं, और @DiscriminatorValue("X")
के साथ प्रत्येक सबक्लास को मानचित्र करें, जहां X
enum (0,1,2,3 ...) का क्रमिक मान होना चाहिए।
यह एक स्थिर स्ट्रिंग के रूप में मान होना चाहिए। आप YourEnum.SOME_VALUE.ordinal()
का उपयोग नहीं कर सकते हैं, क्योंकि एनोटेशन विशेषता मान स्थिरांक होना चाहिए। हाँ, यह थकाऊ है। हां, यह त्रुटि-प्रवण है। लेकिन यह काम करता है।
यह एक हैकी कामकाज है, हालांकि यह काम करता है, मैं एक 'enum' में बड़ी टिप्पणियां डालता हूं जिसका उपयोग' DiscriminatorValue' के रूप में किया जाता है! एनम नामों के साथ भी वही काम करता है ('DiscriminatorType.String' के साथ जो सामान्य से अधिक स्थिर हो सकता है। – TWiStErRob
यदि आप जो हासिल करने की कोशिश कर रहे हैं वह भेदभाव करने वाले मूल्यों को डुप्लिकेट नहीं करना है, तो एक सरल कामकाज है।
@Entity
@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name="FREQUENCY",
discriminatorType=DiscriminatorType.STRING
)
public abstract class Event {
}
@Entity
@DiscriminatorValue(value=Frequency.Values.WEEKLY)
public class WeeklyEvent extends Event {
…
}
public enum Frequency {
DAILY(Values.DAILY),
WEEKLY(Values.WEEKLY),
MONTHLY(Values.MONTHLY);
private String value;
…
public static class Values {
public static final String DAILY = "D";
public static final String WEEKLY = "W";
public static final String MONTHLY = "M";
}
}
सुपर सुरुचिपूर्ण नहीं है, लेकिन कई स्थानों में मूल्यों को बनाए रखने से बेहतर है।
मैं सिर्फ कामकाउंड के बारे में @asa के महान उत्तर में सुधार करना चाहता था। आम तौर पर, हम अक्सर अमूर्त वर्ग की विशेषता के रूप में भेदभावकर्ता कॉलम का उपयोग करना पसंद करते हैं, और निश्चित रूप से enum
के साथ मैप किए जाते हैं। हम अभी भी ऊपर उल्लिखित समाधान का उपयोग कर सकते हैं और enum
नामों (कॉलम को मानचित्रित करने के लिए उपयोग किए गए) और String
मानों (भेदभाव मूल्यों के रूप में उपयोग किए गए) के बीच कुछ स्थिरताओं को मजबूर कर सकते हैं।
public enum ELanguage {
JAVA(Values.JAVA), GROOVY(Values.GROOVY);
private ELanguage (String val) {
// force equality between name of enum instance, and value of constant
if (!this.name().equals(val))
throw new IllegalArgumentException("Incorrect use of ELanguage");
}
public static class Values {
public static final String JAVA= "JAVA";
public static final String GROOVY= "GROOVY";
}
}
और संस्थाओं के लिए, यहाँ कोड है:: यहाँ मेरी सुझाव है
@Entity
@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name="LANGUAGE_TYPE", discriminatorType=DiscriminatorType.STRING)
public abstract class Snippet {
// update/insert is managed by discriminator mechanics
@Column(name = "LANGUAGE_TYPE", nullable = false, insertable = false, updatable = false)
@Enumerated(EnumType.STRING)
public ELanguage languageType
}
@Entity
@DiscriminatorValue(value=ELanguage.Values.JAVA)
public class JavaSnippet extends Snippet {
…
}
फिर भी सही नहीं है, लेकिन एक छोटा सा बेहतर है, मुझे लगता है।
- 1. सिद्धांत: SINGLE_TABLE विरासत
- 2. cURL का उपयोग करते हुए एक रूप
- 3. सी ++ स्थैतिक चर का उपयोग करते हुए विरासत सदस्य कार्य
- 4. का उपयोग करते हुए भाव
- 5. का उपयोग करते हुए योग
- 6. सी में enums का उपयोग कैसे करें ++
- 7. विरासत भेदभावकर्ता को एंटिटी फ्रेमवर्क में समग्र कुंजी के रूप में कैसे चिह्नित करें?
- 8. का उपयोग करते हुए "इस" एक पैरामीटर के रूप कंस्ट्रक्टर
- 9. सी ++ का उपयोग करते हुए 'इस' एक पैरामीटर के रूप
- 10. रेल सहायकों का उपयोग करते हुए आंशिक
- 11. cin.get का उपयोग करते हुए एक पूर्णांक
- 12. का उपयोग करते हुए स्वयं
- 13. ओरेकल में enums का उपयोग कैसे करें?
- 14. नियमित अभिव्यक्ति का उपयोग करते हुए
- 15. threading.Lock संदर्भ प्रबंधक के रूप में उपयोग करते हुए
- 16. Git difftool के रूप में उपयोग करते हुए vim
- 17. का उपयोग करते हुए "इस" में setters
- 18. EventArgs का उपयोग करते हुए जानकारी वर्ग
- 19. Enums का उपयोग GSON
- 20. का उपयोग करते हुए 'HttpContext.Current.Cache' सुरक्षित रूप से
- 21. प्रेरण का उपयोग करते समय जानकारी रखते हुए?
- 22. का उपयोग करते हुए घोषणा (व्युत्पन्न वर्ग)
- 23. का उपयोग करते हुए 'इस' एक निर्माता
- 24. LINQ का उपयोग करते हुए एक सरणी
- 25. का उपयोग करते हुए `issubclass()` Django मॉडल
- 26. Git का उपयोग करते हुए एक फ़ाइल
- 27. preg_match का उपयोग करते हुए एक सूची
- 28. का उपयोग करते हुए ककड़ी परीक्षण 3
- 29. का उपयोग करते हुए पथ Git लॉग
- 30. इस का उपयोग करते हुए onCreate
जेपीए 2.1 ने इसे नहीं बदला है? –
यह जेपीए नहीं है, जावा भाषा आपको एनोटेशन मानों के लिए विधियों को कॉल करने की अनुमति नहीं देती है, देखें: http://docs.oracle.com/javase/specs/jls/se7/html/jls-9.html#jls-9.7 9.7.1 पर, सूची पढ़ें: "' V' का प्रकार असाइनमेंट संगत (§5.2) 'टी' के साथ है, और इसके अलावा:"। तो 'MyEnum.ENUM_CONST.x()' अमान्य है, 'MyEnum.ENUM_CONST' मान्य होगा, लेकिन 'टी' यहां' स्ट्रिंग 'है। – TWiStErRob