ปัญหาการอนุรักษ์
วันนี้เราจะมีโครงร่างใหม่และน่าสนใจอย่างยิ่ง - โดยใช้คุณสมบัติไฮเบอร์เนตเพื่อบันทึกลำดับชั้นของคลาสลงในฐานข้อมูล
ลำดับชั้นของคลาสคือชุดของคลาสที่เกี่ยวข้องกันโดยความสัมพันธ์แบบสืบทอด
ลองนึกภาพว่าคุณมีสามคลาสที่คุณต้องการจัดเก็บไว้ในฐานข้อมูล:
class User {
int id;
String name;
LocalDate birthday;
}
class Employee extends User {
String occupation;
int salary;
LocalDate join;
}
class Client extends User {
String address;
}
ชั้นเรียนได้รับการสืบทอดจากกันและกัน และสิ่งที่น่าสนใจที่สุดคือคุณต้องการใช้ Hibernate เพื่อจัดเก็บวัตถุของคลาสเหล่านี้ในฐานข้อมูล
ประเภทโซลูชัน
Hibernate มี 4 วิธีที่เป็นไปได้ในการเชื่อมโยงลำดับชั้นของคลาสกับตารางในฐานข้อมูล:
- MappedSuperclass
- ตารางเดียว
- ตารางที่เข้าร่วม
- ตารางต่อชั้นเรียน
แต่ละกลยุทธ์ถือว่าโครงสร้างตารางของตัวเองในฐานข้อมูล บางครั้งก็ค่อนข้างซับซ้อน แต่การค้นหา HQL สำหรับพวกเขานั้นง่ายมาก นี่เป็นกรณีที่แสดงให้เห็นถึงข้อดีของ Hibernate อย่างชัดเจน
ฉันไม่เคยได้ยินคำศัพท์เหล่านี้แปลเป็นภาษารัสเซีย ดังนั้นฉันจึงแนะนำให้ออกเสียงเป็นภาษาอังกฤษด้วย
ด้านล่างนี้เราจะวิเคราะห์ความหมายของแต่ละข้อ
@MappedSuperClass
เริ่มจากวิธีแก้ปัญหาที่ง่ายที่สุด - ในฐานข้อมูล คุณมีตารางแยกต่างหากสำหรับแต่ละคลาส ตัวอย่างเช่น:
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
}
มีเพียงคุณเท่านั้นที่รู้ว่าคลาสของตารางเหล่านี้เชื่อมต่อกันเป็นลำดับชั้น หากคุณต้องการให้ Hibernate รู้เกี่ยวกับสิ่งนี้ด้วย คุณต้องเพิ่มคำ อธิบายประกอบ @MappedSuperclass ให้กับคลาสพาเรนต์ หากไม่มี Hibernate ก็จะเพิกเฉยต่อฟิลด์และคำอธิบายประกอบของคลาสพาเรนต์
คลาสที่มีคำอธิบายประกอบนี้จะมีลักษณะดังนี้:
@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;
}
นี่เป็นวิธีดั้งเดิมที่สุดในการเชื่อมโยงลำดับชั้นของคลาสและฐานข้อมูล วิธีการนี้ช่วยให้คุณหลีกเลี่ยงฟิลด์ที่ซ้ำกันในชั้นเรียนเท่านั้น
การสืบค้นฐานข้อมูลใน HQL จะส่งคืนเฉพาะเอนทิตีที่ระบุประเภทอย่างชัดเจน คุณไม่สามารถเขียนแบบสอบถามฐานข้อมูลใน HQL และรับรายชื่อผู้ใช้ทั้งหมด: ผู้ใช้ พนักงาน ลูกค้า