వివరణ

మునుపటి పాఠంలో, ఎంటిటీ తరగతి పేరును నిల్వ చేయడానికి హైబర్నేట్ ప్రత్యేక DTYPE VARCHAR నిలువు వరుసను ఉపయోగిస్తుందని మీరు చూశారు. అటువంటి కాలమ్‌ను వివక్షత అంటారు . డేటాబేస్లో ఇచ్చిన అడ్డు వరుస కోసం ఏ తరగతిని సృష్టించాలో నిస్సందేహంగా నిర్ణయించడానికి ఇది ఉపయోగించబడుతుంది.

మీరు @DiscriminatorColumn ఉల్లేఖనతో ఈ నిలువు వరుసను మార్చవచ్చు . ఉదాహరణ:

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

JPA స్పెసిఫికేషన్ ప్రకారం, ఒక వివక్షత క్రింది రకాలను కలిగి ఉండవచ్చు:

  • STRING
  • చార్
  • పూర్ణ సంఖ్య

అయితే, హైబర్నేట్ ఈ జాబితాను కొంచెం విస్తరించడానికి మిమ్మల్ని అనుమతిస్తుంది. ఇది ఈ జావా రకాలకు మద్దతు ఇస్తుంది: స్ట్రింగ్, చార్, ఇంట్, బైట్, షార్ట్, బూలియన్.

మనం INTEGER రకాన్ని ఉపయోగిస్తే, దానిలోని ఎంటిటీ క్లాస్ పేరును ఎన్‌కోడ్ చేయడం ఎలా? దీని కోసం, మరొక ఉల్లేఖనం ఉపయోగించబడుతుంది - @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;
}

ఎగువ ఉదాహరణలో, వివక్షత వినియోగదారు_రకం కాలమ్‌ని ఉపయోగిస్తుందని మేము హైబర్నేట్‌కి చెప్పాము, ఇది సంఖ్యలను నిల్వ చేస్తుంది. ఇది 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;
}

యూజర్_టైప్ కాలమ్‌లో 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 కాలమ్‌లో NULL కాని విలువ కలిగిన ఏదైనా పట్టిక అడ్డు వరుస వినియోగదారు రకం యొక్క వస్తువుగా అన్వయించబడాలని మేము హైబర్నేట్‌కి చెప్పాము. కానీ అవసరమైన సంఖ్యను స్పష్టంగా పేర్కొన్న తరగతి కనుగొనబడకపోతే ఇది కేసు కోసం మాత్రమే.

వివక్ష చూపేవారి విభిన్న విలువలకు ఇది ఈ విధంగా పని చేస్తుంది:

  • 0 - వినియోగదారు రకం యొక్క వస్తువును సృష్టించండి
  • 1 - ఉద్యోగి రకం యొక్క వస్తువును సృష్టించండి
  • 2 - రకం క్లయింట్ యొక్క వస్తువును సృష్టించండి
  • 3 - వినియోగదారు రకం యొక్క వస్తువును సృష్టించండి
  • 4 - వినియోగదారు రకం యొక్క వస్తువును సృష్టించండి

@డిస్క్రిమినేటర్ ఫార్ములా

అయితే అంతే కాదు. మా వివక్షకు, మేము @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 "
)