விளக்கம்
முந்தைய பாடத்தில், ஒரு நிறுவன வகுப்பின் பெயரைச் சேமிக்க ஹைபர்னேட் ஒரு சிறப்பு DTYPE VARCHAR நிரலைப் பயன்படுத்துவதைப் பார்த்தீர்கள். அத்தகைய நெடுவரிசை ஒரு பாகுபாடு என்று அழைக்கப்படுகிறது . தரவுத்தளத்தில் கொடுக்கப்பட்ட வரிசைக்கு எந்த வகுப்பை உருவாக்குவது என்பதை சந்தேகத்திற்கு இடமின்றி தீர்மானிக்க இது பயன்படுகிறது.
@DiscriminatorColumn சிறுகுறிப்பு மூலம் இந்த நெடுவரிசையை நீங்கள் கையாளலாம் . உதாரணமாக:
@DiscriminatorColumn(name="column_name", discriminatorType = DiscriminatorType.INTEGER)
JPA விவரக்குறிப்பின்படி, ஒரு பாகுபாடு பின்வரும் வகைகளைக் கொண்டிருக்கலாம்:
- லேசான கயிறு
- சார்
- முழு
இருப்பினும், ஹைபர்னேட் இந்த பட்டியலை சிறிது விரிவாக்க அனுமதிக்கிறது. இது இந்த ஜாவா வகைகளை ஆதரிக்கிறது: ஸ்ட்ரிங், சார், இன்ட், பைட், ஷார்ட், பூலியன்.
நாம் 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 ஆக இருக்கும்போது அதன் வகையை எவ்வாறு விளக்குவது என்பதை நீங்கள் Hibernate க்கு கூறலாம்.
இது உண்மையில் மிகவும் எளிமையானது. @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;
}
இந்த சிறுகுறிப்பு மூலம், பயனர்_வகை நெடுவரிசையில் NULL அல்லாத மதிப்பைக் கொண்ட எந்த அட்டவணை வரிசையும் பயனர் வகையின் பொருளாக விளக்கப்பட வேண்டும் என்று நாங்கள் Hibernate ஐச் சொன்னோம். ஆனால், தேவையான எண்ணை வெளிப்படையாகக் குறிப்பிடும் வகுப்பைக் காணவில்லை என்றால், இது வழக்கில் மட்டுமே.
பாகுபாடு காட்டுபவர்களின் வெவ்வேறு மதிப்புகளுக்கு இது எவ்வாறு வேலை செய்யும்:
- 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 சிறுகுறிப்புகளில் குறிப்பிடப்பட்டுள்ள மதிப்புகளுடன் Hibernate மூலம் ஒப்பிடப்படும் . அதன் மூலம், நீங்கள் மிகவும் சிக்கலான காட்சிகளை எழுதலாம்:
@DiscriminatorFormula(
"case when address is not null " +
"then 'Client' " +
"else (" +
" case when occupation is not null " +
" then 'Employee' " +
" else 'Unknown' " +
" end) " +
"end "
)