ปัญหาการอนุรักษ์

วันนี้เราจะมีโครงร่างใหม่และน่าสนใจอย่างยิ่ง - โดยใช้คุณสมบัติไฮเบอร์เนตเพื่อบันทึกลำดับชั้นของคลาสลงในฐานข้อมูล

ลำดับชั้นของคลาสคือชุดของคลาสที่เกี่ยวข้องกันโดยความสัมพันธ์แบบสืบทอด

ลองนึกภาพว่าคุณมีสามคลาสที่คุณต้องการจัดเก็บไว้ในฐานข้อมูล:

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 และรับรายชื่อผู้ใช้ทั้งหมด: ผู้ใช้ พนักงาน ลูกค้า