वर्णन

मागील धड्यात, तुम्ही पाहिले की हायबरनेट विशिष्ट DTYPE VARCHAR कॉलम वापरते ते एखाद्या घटक वर्गाचे नाव संग्रहित करण्यासाठी. अशा स्तंभाला भेदभाव म्हणतात . डेटाबेसमध्ये दिलेल्या पंक्तीसाठी कोणता वर्ग तयार करायचा हे स्पष्टपणे निर्धारित करण्यासाठी याचा वापर केला जातो.

तुम्ही @DiscriminatorColumn भाष्यासह हा स्तंभ हाताळू शकता . उदाहरण:

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

जेपीए विनिर्देशानुसार, भेदभाव करणाऱ्यामध्ये खालील प्रकार असू शकतात:

  • STRING
  • CHAR
  • पूर्णांक

तथापि, हायबरनेट तुम्हाला ही यादी थोडी विस्तृत करण्याची परवानगी देते. हे या जावा प्रकारांना समर्थन देते: स्ट्रिंग, चार, इंट, बाइट, शॉर्ट, बुलियन.

जर आपण INTEGEER प्रकार वापरला तर त्यात 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 असलेली कोणतीही टेबल पंक्ती User प्रकारातील ऑब्जेक्ट म्हणून समजली जावी.

पण एवढेच नाही. @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 कॉलममधील NULL मूल्य नसलेल्या कोणत्याही टेबल पंक्तीचा वापरकर्ता प्रकाराचा ऑब्जेक्ट म्हणून अर्थ लावला पाहिजे. परंतु हे केवळ अशा प्रकरणासाठी आहे जर एखादा वर्ग स्पष्टपणे निर्दिष्ट केलेला आवश्यक क्रमांक सापडला नाही.

भेदभाव करणाऱ्यांच्या विविध मूल्यांसाठी हे कसे कार्य करेल:

  • 0 - वापरकर्त्याचा प्रकार एक ऑब्जेक्ट तयार करा
  • 1 - कर्मचा- या प्रकारची एक वस्तू तयार करा
  • 2 - क्लायंट प्रकाराचा एक ऑब्जेक्ट तयार करा
  • 3 - वापरकर्त्याचा प्रकार एक ऑब्जेक्ट तयार करा
  • 4 - वापरकर्त्याचा प्रकार एक ऑब्जेक्ट तयार करा

@DiscriminatorFormula

पण एवढेच नाही. आमच्या discriminator साठी, आम्ही पूर्णांक सूत्र निर्दिष्ट करू शकतो ज्याद्वारे ते @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 "
)