विवरण

एक वर्ग पदानुक्रम को संग्रहीत करने का अगला तरीका सभी वर्गों को एक ही तालिका में पदानुक्रम में संग्रहीत करना है । इस रणनीति को सिंगल टेबल कहा जाता है ।

उदाहरण के लिए, इस तरह:

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 कॉलम के आधार पर, इकाई प्रकार सही ढंग से निर्धारित किया जाएगा और सही वर्ग का एक ऑब्जेक्ट बनाया जाएगा।

हमारे मामले में, खातों की सूची में दो वस्तुएँ होंगी: एक कर्मचारी प्रकार और एक ग्राहक प्रकार।

एचक्यूएल नियम।