2010-09-03 9 views

उत्तर

2

मेरी जानकारी के लिए, इस एनोटेशन के साथ संभव नहीं है:

  • discriminator मान प्रकार का होना चाहिए String
  • discriminator मूल्य एक संकलन समय-निरंतर होना चाहिए, enums पर तरीकों से यानी वापसी मान हैं अनुमति नहीं हैं।
+0

जेपीए 2.1 ने इसे नहीं बदला है? –

+0

यह जेपीए नहीं है, जावा भाषा आपको एनोटेशन मानों के लिए विधियों को कॉल करने की अनुमति नहीं देती है, देखें: 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

2

हाँ, जब आप discriminator परिभाषित टिप्पणियों का विकल्प हैं नाम और discrimatorType

@DiscriminatorColumn (name="MYDISCRIMINATOR", discriminatorType= DiscriminatorType.INTEGER) 

जिनमें से DiscriminatorType केवल हो सकता है:

DiscriminatorType.STRING 
DiscriminatorType.CHAR 
DiscriminatorType.INTEGER 

दुर्भाग्यपूर्ण है कि मैं इस कल नहीं देख पा रहे हैं, लेकिन अच्छी तरह से किया था । इस तरह यह

+3

और ध्यान दें कि 'DiscriminatorType' डीबी प्रकार को संदर्भित करता है, न कि जावा प्रकार। 'DiscriminatorValue' अभी भी एक स्ट्रिंग के रूप में उद्धरण में एक संख्या होना चाहिए। – TWiStErRob

6

नहीं, दुर्भाग्य से आप नहीं कर सकते हैं।

यदि आप एक एनम को भेदभाव मूल्य के रूप में उपयोग करने का प्रयास करते हैं, तो आपको एक टाइप मिस्चैच अपवाद ("माईएनम से स्ट्रिंग में परिवर्तित नहीं किया जा सकता") मिलेगा, क्योंकि केवल भेदभावकर्ता प्रकारों को स्ट्रिंग, चार और इंटीजर की अनुमति है। अगला, मैंने क्रमशः 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 
} 
1

आप DiscriminatorType.INTEGER का उपयोग कर सकते हैं, और @DiscriminatorValue("X") के साथ प्रत्येक सबक्लास को मानचित्र करें, जहां X enum (0,1,2,3 ...) का क्रमिक मान होना चाहिए।

यह एक स्थिर स्ट्रिंग के रूप में मान होना चाहिए। आप YourEnum.SOME_VALUE.ordinal() का उपयोग नहीं कर सकते हैं, क्योंकि एनोटेशन विशेषता मान स्थिरांक होना चाहिए। हाँ, यह थकाऊ है। हां, यह त्रुटि-प्रवण है। लेकिन यह काम करता है।

+0

यह एक हैकी कामकाज है, हालांकि यह काम करता है, मैं एक 'enum' में बड़ी टिप्पणियां डालता हूं जिसका उपयोग' DiscriminatorValue' के रूप में किया जाता है! एनम नामों के साथ भी वही काम करता है ('DiscriminatorType.String' के साथ जो सामान्य से अधिक स्थिर हो सकता है। – TWiStErRob

23

यदि आप जो हासिल करने की कोशिश कर रहे हैं वह भेदभाव करने वाले मूल्यों को डुप्लिकेट नहीं करना है, तो एक सरल कामकाज है।

@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"; 
    } 
} 

सुपर सुरुचिपूर्ण नहीं है, लेकिन कई स्थानों में मूल्यों को बनाए रखने से बेहतर है।

13

मैं सिर्फ कामकाउंड के बारे में @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 { 
    … 
} 

फिर भी सही नहीं है, लेकिन एक छोटा सा बेहतर है, मुझे लगता है।

संबंधित मुद्दे