संरक्षण के मुद्दे

आज हमारे पास एक नई और सुपर दिलचस्प योजना होगी - डेटाबेस में वर्ग पदानुक्रम को बचाने के लिए हाइबरनेट सुविधाओं का उपयोग करना।

एक वर्ग पदानुक्रम एक वंशानुक्रम संबंध द्वारा एक दूसरे से संबंधित वर्गों का एक समूह है।

कल्पना करें कि आपके पास तीन वर्ग हैं जिन्हें आप डेटाबेस में संग्रहित करना चाहते हैं:

class User {
  int id;
  String name;
  LocalDate birthday;
}
class Employee extends User {
 	String occupation;
 	int salary;
 	LocalDate join;
}
class Client extends User {
   String address;
}

कक्षाएं एक दूसरे से विरासत में मिली हैं। और सबसे दिलचस्प बात यह है कि आप इन वर्गों की वस्तुओं को डेटाबेस में संग्रहीत करने के लिए हाइबरनेट का उपयोग करना चाहते हैं।

समाधान के प्रकार

हाइबरनेट के 4 संभावित तरीके हैं जिनसे यह एक वर्ग पदानुक्रम को एक डेटाबेस में तालिकाओं के साथ जोड़ सकता है:

  • मैप्डसुपरक्लास
  • एकल तालिका
  • ज्वाइन टेबल
  • तालिका प्रति वर्ग

प्रत्येक रणनीति डेटाबेस में अपनी स्वयं की तालिका संरचना मानती है। कभी-कभी ये काफी जटिल होते हैं। लेकिन उनके लिए एचक्यूएल के लिए प्रश्न बहुत सरल हैं। ठीक यही स्थिति है जहां हाइबरनेट के फायदे स्पष्ट रूप से प्रकट होते हैं।

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

नीचे हम विश्लेषण करेंगे कि उनमें से प्रत्येक का क्या अर्थ है।

@ मैप्डसुपरक्लास

आइए सबसे सरल समाधान से शुरू करें - डेटाबेस में आपके पास प्रत्येक वर्ग के लिए अलग टेबल हैं । उदाहरण के लिए, ये:

CREATE TABLE user {
  id INT,
  name VARCHAR,
  birthday DATE
}
CREATE TABLE employee {
  id INT,
  name VARCHAR,
  birthday DATE,
  occupation VARCHAR,
  salary INT,
  join DATE
}
CREATE TABLE client {
  id INT,
  name VARCHAR,
  birthday DATE,
  address VARCHAR
}

केवल आप जानते हैं कि इन तालिकाओं के वर्ग पदानुक्रम में जुड़े हुए हैं । यदि आप हाइबरनेट को इसके बारे में भी जानना चाहते हैं, तो आपको @MappedSuperclass एनोटेशन को पैरेंट क्लास में जोड़ना होगा । इसके बिना, हाइबरनेट मूल वर्ग के क्षेत्रों और एनोटेशन को आसानी से अनदेखा कर देगा।

इस एनोटेशन वाली कक्षाएं इस तरह दिखेंगी:

@MappedSuperclass
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;
}

वर्ग पदानुक्रम और डेटाबेस को जोड़ने का यह सबसे आदिम तरीका है। यह दृष्टिकोण वास्तव में आपको कक्षाओं में डुप्लिकेट फ़ील्ड से बचने की अनुमति देता है।

एचक्यूएल में डेटाबेस प्रश्न केवल उस इकाई को लौटाएगा जिसका प्रकार स्पष्ट रूप से निर्दिष्ट किया गया है। आप एचक्यूएल में डेटाबेस क्वेरी नहीं लिख सकते हैं और सभी उपयोगकर्ताओं की सूची प्राप्त कर सकते हैं: उपयोगकर्ता, कर्मचारी, ग्राहक।