5.1 คำอธิบาย

และสุดท้าย กลยุทธ์สุดท้ายคือตารางต่อชั้นเรียน หมายความว่าจะใช้ตารางแยกต่างหากสำหรับแต่ละชั้นเรียน ในแง่หนึ่ง นี่คือ 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
}

ข้อแตกต่างที่สำคัญคือ pass-through id (PRIMARY KEY) ใช้สำหรับตารางทั้งหมด คุณไม่สามารถมีแถวที่แตกต่างกันด้วยรหัสเดียวกัน ไม่เพียงแต่ในตารางเดียวกันเท่านั้น แต่ยังอยู่ในกลุ่มของตารางนี้ด้วย ไฮเบอร์เนตจะดูแลสิ่งนี้

5.2 ตัวอย่าง

มันน่าสนใจมากที่จะเห็นว่ามันทำงานอย่างไร

คุณสามารถเขียนแบบสอบถาม HQL อย่างง่ายเพื่อรับผู้ใช้ทั้งหมด: User, Employee, Client :

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

ข่าวดีก็คือการสืบค้น HQL จะทำงานตามที่คุณต้องการ

ข่าวร้ายก็คืออาจทำงานช้าหากมีข้อมูลจำนวนมากในตาราง เนื่องจากก่อนอื่นคุณต้องเลือกข้อมูลจากตารางทั้งหมด จากนั้นจึงรวมแถวด้วยUNION ALLแล้วจึงกรองเท่านั้น