विवरण

पिछले पाठ में, आपने देखा कि हाइबरनेट एक इकाई वर्ग के नाम को संग्रहीत करने के लिए एक विशेष DTYPE VARCHAR कॉलम का उपयोग करता है। ऐसे स्तंभ को विवेचक कहा जाता है । इसका उपयोग स्पष्ट रूप से यह निर्धारित करने के लिए किया जाता है कि डेटाबेस में दी गई पंक्ति के लिए कौन सी कक्षा बनाई जाए।

आप @DiscriminatorColumn एनोटेशन के साथ इस कॉलम में हेरफेर कर सकते हैं । उदाहरण:

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

जेपीए विनिर्देश के अनुसार, एक विवेचक के निम्न प्रकार हो सकते हैं:

  • डोरी
  • चार
  • पूर्णांक

हालाँकि, हाइबरनेट आपको इस सूची को थोड़ा विस्तारित करने की अनुमति देता है। यह इन जावा प्रकारों का समर्थन करता है: स्ट्रिंग, चार, इंट, बाइट, शॉर्ट, बूलियन।

यदि हम INTEGER प्रकार का उपयोग करते हैं, तो इसमें Entity वर्ग का नाम कैसे एन्कोड करें? इसके लिए एक अन्य एनोटेशन का उपयोग किया जाता है - @DiscriminatorValue

एक उदाहरण देखें:

@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name="user_type",   discriminatorType = DiscriminatorType.INTEGER)
@Entity
class User {
  int id;
  String name;
  LocalDate birthday;
}
@Entity
@DiscriminatorValue("1")
class Employee extends User {
 	String occupation;
 	int salary;
 	LocalDate join;
}
@Entity
@DiscriminatorValue("2")
class Client extends User {
   String address;
}

उपरोक्त उदाहरण में, हमने हाइबरनेट को बताया कि विवेचक user_type कॉलम का उपयोग करेगा, जो संख्याओं को संग्रहीत करेगा। यदि यह मान 1 संग्रहीत करता है, तो इसका अर्थ है कि पंक्ति प्रकार कर्मचारी है, यदि 2 संग्रहीत है, तो पंक्ति प्रकार क्लाइंट है। सरल और सुंदर।

@DiscriminatorValue

लेकिन वह सब नहीं है। आप हाइबरनेट को बता सकते हैं कि स्ट्रिंग के प्रकार की व्याख्या कैसे करें जब उसका विवेचक NULL हो।

यह वास्तव में बहुत आसान है। आप @DiscriminatorValue एनोटेशन के लिए शून्य मान निर्दिष्ट करते हैं । उदाहरण के लिए, इस तरह:

@DiscriminatorValue("null")

वर्ग उदाहरण:

@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name="user_type",   discriminatorType = DiscriminatorType.INTEGER)
@DiscriminatorValue("null")
@Entity
class User {
  int id;
  String name;
  LocalDate birthday;
}

हमने हाइबरनेट को बताया है कि user_type कॉलम में NULL वाली किसी भी तालिका पंक्ति को उपयोगकर्ता प्रकार के ऑब्जेक्ट के रूप में व्याख्या किया जाना चाहिए।

लेकिन वह सब नहीं है। @DiscriminatorValue एनोटेशन के लिए एक और दिलचस्प मूल्य है।

यहाँ यह है:

@DiscriminatorValue("not null")

वर्ग उदाहरण:

@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name="user_type",   discriminatorType = DiscriminatorType.INTEGER)
@DiscriminatorValue("not null")
@Entity
class User {
  int id;
  String name;
  LocalDate birthday;
}

इस एनोटेशन के साथ, हमने हाइबरनेट को बताया कि user_type कॉलम में गैर-पूर्ण मान वाली किसी भी तालिका पंक्ति को उपयोगकर्ता प्रकार के ऑब्जेक्ट के रूप में व्याख्या किया जाना चाहिए। लेकिन यह केवल उस मामले के लिए है यदि कोई वर्ग नहीं मिला है जिसमें आवश्यक संख्या स्पष्ट रूप से निर्दिष्ट है।

यह भेदभाव करने वालों के विभिन्न मूल्यों के लिए कैसे काम करेगा:

  • 0 - उपयोगकर्ता प्रकार का ऑब्जेक्ट बनाएं
  • 1 - कर्मचारी प्रकार का एक वस्तु बनाएँ
  • 2 - क्लाइंट प्रकार का ऑब्जेक्ट बनाएं
  • 3 - उपयोगकर्ता प्रकार का ऑब्जेक्ट बनाएं
  • 4 - उपयोगकर्ता प्रकार का ऑब्जेक्ट बनाएं

@DiscriminatorFormula

लेकिन वह सब नहीं है। हमारे विवेचक के लिए, हम एक पूर्णांक सूत्र निर्दिष्ट कर सकते हैं जिसके द्वारा यह @DiscriminatorValue एनोटेशन के मूल्यों की गणना करेगा ।

इसके लिए एक विशेष एनोटेशन है, इसे @DiscriminatorFormula कहा जाता है ।

उदाहरण:

@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name="user_type",   discriminatorType = DiscriminatorType.INTEGER)
@DiscriminatorFormula("case when ‘join’ is not null then 1 else 2 end")
@Entity
class User {
  int id;
  String name;
  LocalDate birthday;
}
@Entity
@DiscriminatorValue("1")
class Employee extends User {
 	String occupation;
 	int salary;
 	LocalDate join;
}
@Entity
@DiscriminatorValue("2")
class Client extends User {
   String address;
}

@DiscriminatorFormula द्वारा लौटाए गए मानों की तुलना @DiscriminatorValue एनोटेशन में निर्दिष्ट मानों के साथ हाइबरनेट द्वारा की जाएगी । इसके साथ, आप काफी जटिल परिदृश्य लिख सकते हैं:

@DiscriminatorFormula(
           	"case when address is not null " +
           	"then 'Client' " +
           	"else (" +
           	"   case when occupation is not null " +
           	"   then 'Employee' " +
           	"   else 'Unknown' " +
           	"   end) " +
           	"end "
)