5.1 विवरण

और अंत में, अंतिम रणनीति तालिका प्रति वर्ग है। यानी हर क्लास के लिए अलग टेबल का इस्तेमाल किया जाएगा। एक अर्थ में, यह वही मैप्डसुपरक्लास है, केवल एक अद्यतन रूप में।

सबसे पहले, आपको एनोटेशन का उपयोग करने की आवश्यकता है:

@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)

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


@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
@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;
}

और हर क्लास के लिए अलग टेबल। उदाहरण के लिए, ये:


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
}

मुख्य अंतर यह है कि सभी तालिकाओं के लिए पास-थ्रू आईडी (प्राथमिक कुंजी) का उपयोग किया जाता है। आपके पास एक ही आईडी के साथ अलग-अलग पंक्तियाँ नहीं हो सकती हैं, न केवल एक ही तालिका के भीतर, बल्कि तालिकाओं के इस समूह के भीतर भी। हाइबरनेट इसका ख्याल रखेगा।

5.2 उदाहरण

यह देखना बहुत दिलचस्प है कि यह सब कैसे काम करता है।

आप सभी उपयोगकर्ताओं को प्राप्त करने के लिए एक साधारण एचक्यूएल क्वेरी लिख सकते हैं: उपयोगकर्ता, कर्मचारी, ग्राहक :

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

लेकिन हाइबरनेट, बदले में, एक बहुत ही रोचक क्वेरी उत्पन्न करेगा। यह सभी तालिकाओं से एक चयन करेगा, फिर इसे UNION ALL के माध्यम से एक प्रकार की आभासी तालिका में संयोजित करेगा, और उसके बाद ही यह खोज और / या चयन करेगा

लेकिन अलग-अलग कॉलम के साथ टेबल मर्ज करने के लिए, उन्हें पहले नकली कॉलम के साथ पूरक करने की आवश्यकता होती है। उदाहरण के लिए, उपयोगकर्ता तालिका को स्तंभों के साथ पूरक करने की आवश्यकता है:

  • occupation VARCHAR
  • salary INT
  • join DATE
  • address VARCHAR

निष्पादन से पहले उपयोगकर्ता तालिका में SQL क्वेरी का एक उदाहरण UNION ALL:


SELECT   id,
         name,
         birthday,
         CAST(NULL AS VARCHAR) AS occupation,
         CAST(NULL AS INT) AS salary,
         CAST(NULL AS DATE) AS join,
         CAST(NULL AS VARCHAR) AS address,
         0 AS clazz
FROM  user

निष्पादन से पहले कर्मचारी तालिका के लिए एक उदाहरण SQL क्वेरी UNION ALL:


SELECT   id,
         name,
         birthday,
         occupation,
         salary,
         join,
         CAST(NULL AS VARCHAR) AS address,
         1 AS clazz
FROM  employee

निष्पादन से पहले क्लाइंट तालिका में SQL क्वेरी का एक उदाहरण UNION ALL:


SELECT  id,
        name,
        birthday,
        CAST(NULL AS VARCHAR) AS occupation,
        CAST(NULL AS INT) AS salary,
        CAST(NULL AS DATE) AS join,
        address,
        2 AS clazz
FROM client

अच्छी खबर यह है कि एचक्यूएल प्रश्न आपके इच्छित तरीके से काम करेंगे।

बुरी खबर यह है कि अगर तालिकाओं में बहुत अधिक डेटा है तो वे धीमे हो सकते हैं। क्योंकि पहले आपको सभी तालिकाओं से डेटा का चयन करना होगा, फिर उनकी पंक्तियों को साथ जोड़ना होगा UNION ALL, और उसके बाद ही फ़िल्टर करना होगा।