వివరణ

తరగతి సోపానక్రమాన్ని నిల్వ చేయడానికి తదుపరి విధానం ఏమిటంటే, సోపానక్రమంలోని అన్ని తరగతులను ఒకే పట్టికలో నిల్వ చేయడం . ఈ వ్యూహాన్ని సింగిల్ టేబుల్ అంటారు .

ఉదాహరణకు, ఇలా:

CREATE TABLE user_ employee_client {
  id INT,
  name VARCHAR,
  birthday DATE,
  occupation VARCHAR,
  salary INT,
  join DATE,
  address VARCHAR,
  DTYPE VARCHAR
}

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

ఎంటిటీ తరగతుల డేటా ఇప్పుడు డేటాబేస్‌లో ఒక టేబుల్‌లో నిల్వ చేయబడిందని హైబర్నేట్‌కు వివరించడం మాత్రమే మిగిలి ఉంది. ఇది @Inheritance ఉల్లేఖనాన్ని ఉపయోగించి చేయవచ్చు :

@Inheritance(strategy = InheritanceType.SINGLE_TABLE)

మా తరగతులకు ఉదాహరణ:

@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@Entity
class User {
  int id;
  String name;
  LocalDate birthday;
}
@Entity
class Employee extends User {
 	String occupation;
 	int salary;
 	LocalDate join;
}
@Entity
class Client extends User {
   String address;
}

డేటా ఎలా నిల్వ చేయబడుతుంది

ఇప్పుడు మనం మన రెండు ఎంటిటీలను సృష్టించి, వాటిని డేటాబేస్‌లో సేవ్ చేసే ఉదాహరణను వ్రాద్దాం:

Employee employee = new Employee();
employee.id = 101;
employee.name = "Ivanov";
employee.birthday = LocalDate.of("01-01-1999");
employee.occupation = "Programmer"
employee.salary = 100000;
employee.join = LocalDate.of("12-01-2018");
session.persist(employee);

Client client = new Client();
client.id = 102;
client.name = "Petrov";
client.birthday = LocalDate.of("15-11-1988");
client.address = "Shandara";
session.persist(client);

డేటాబేస్కు సేవ్ చేస్తున్నప్పుడు, క్రింది SQL ప్రశ్న అమలు చేయబడుతుంది:

INSERT INTO user_ employee_client (id, name, birthday, occupation, salary, join, DTYPE)
VALUES (101, 'Ivanov', '01-01-1999', 'Programmer', 100000, '12-01-2018', 'Employee')

INSERT INTO user_ employee_client (id, name, birthday, address, DTYPE)
VALUES (102, 'Petrov', '15-11-1988', 'Shandara', 'Client')

పట్టికలో డేటాను సేవ్ చేస్తున్నప్పుడు, హైబర్నేట్ తనకు తెలిసిన ఎంటిటీ ఫీల్డ్‌లను మాత్రమే పాస్ చేస్తుంది. దీని అర్థం పేర్కొనబడని నిలువు వరుసలు NULL అవుతాయి.

మరియు దీని అర్థం మీరు ఆక్యుపేషన్ కాలమ్ కోసం NOT NULL రకాన్ని పేర్కొనలేరు, ఎందుకంటే క్లయింట్ అదే పట్టికలో నిల్వ చేయబడినప్పుడు, అతని వృత్తి NULL అవుతుంది. ఒకే టేబుల్‌లో వేర్వేరు ఎంటిటీలను నిల్వ చేయడం వల్ల కలిగే నష్టాలలో ఇది ఒకటి.

SQL ప్రశ్నలోని చివరి ఫీల్డ్ DTYPE కాలమ్, ఇది ఎంటిటీ క్లాస్ పేరును కలిగి ఉంటుంది. మీరు మీ టేబుల్ నుండి డేటాను చదవాలనుకున్నప్పుడు ఇది హైబర్నేట్ ద్వారా ఉపయోగించబడుతుంది.

ఉదాహరణ:

List<User> accounts = session.createQuery("from User").list();

ఈ ప్రశ్న డేటాబేస్లో నిల్వ చేయబడిన అన్ని వినియోగదారు-రకం వస్తువుల జాబితాను అందిస్తుంది: వినియోగదారు, ఉద్యోగి మరియు క్లయింట్. DTYPE నిలువు వరుస ఆధారంగా, ఎంటిటీ రకం సరిగ్గా నిర్ణయించబడుతుంది మరియు సరైన తరగతికి చెందిన వస్తువు సృష్టించబడుతుంది.

మా విషయంలో, ఖాతాల జాబితాలో రెండు వస్తువులు ఉంటాయి: ఒక ఉద్యోగి రకం మరియు క్లయింట్ రకం.

HQL నియమాలు.