५.१ वर्णन

आणि शेवटी, शेवटची रणनीती प्रति वर्ग सारणी आहे. म्हणजे प्रत्येक वर्गासाठी स्वतंत्र तक्ता वापरला जाईल. एका अर्थाने, हे समान MappedSuperClass आहे, केवळ एका अद्ययावत स्वरूपात.

प्रथम, आपल्याला भाष्य वापरण्याची आवश्यकता आहे:

@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 उदाहरणे

हे सर्व कसे कार्य करते हे पाहणे खूप मनोरंजक आहे.

सर्व वापरकर्ते मिळविण्यासाठी तुम्ही एक साधी HQL क्वेरी लिहू शकता: वापरकर्ता, कर्मचारी, क्लायंट :

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

अंमलबजावणीपूर्वी कर्मचार्‍यांच्या टेबलवर एसक्यूएल क्वेरीचे उदाहरण 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

चांगली बातमी अशी आहे की HQL क्वेरी तुम्हाला पाहिजे तसे काम करतील.

वाईट बातमी अशी आहे की टेबलमध्ये भरपूर डेटा असल्यास ते धीमे असू शकतात. कारण प्रथम तुम्हाला सर्व सारण्यांमधून डेटा निवडणे आवश्यक आहे, नंतर त्यांच्या पंक्ती एकत्र करा UNION ALLआणि त्यानंतरच फिल्टर करा.