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
แล้วจึงกรองเท่านั้น
GO TO FULL VERSION