คำอธิบาย

แต่ละกลยุทธ์และเทคนิคข้างต้นมีข้อดีและข้อเสียในตัวเอง คำแนะนำทั่วไปสำหรับการเลือกกลยุทธ์เฉพาะจะมีลักษณะดังนี้:

กลยุทธ์ TABLE_PER_CLASS ขึ้นอยู่กับ UNION

กลยุทธ์นี้เหมาะที่สุดหากไม่ต้องการการสืบค้นและการเชื่อมโยงที่หลากหลาย หากคุณไม่ค่อยได้ทำ (หรือไม่ทำเลย) "เลือกผู้ใช้จากผู้ใช้ผู้ใช้" หากคุณไม่มีคลาสเอนทิตีที่อ้างถึงผู้ใช้ นี่เป็นตัวเลือกที่ดีที่สุด (เพราะคุณยังคงสามารถเพิ่มการสืบค้นและการเชื่อมโยงแบบโพลีมอร์ฟิคที่ปรับให้เหมาะสมได้)

กลยุทธ์ SINGLE_TABLE

ควรใช้กลยุทธ์นี้:

ก) สำหรับงานง่ายๆ เท่านั้น ในสถานการณ์ที่การทำให้เป็นปกติและข้อจำกัดที่ไม่เป็นโมฆะมีความสำคัญ ควรใช้กลยุทธ์ #3 (เข้าร่วม) มันสมเหตุสมผลแล้วที่จะคิดว่าในกรณีนี้มันไม่คุ้มค่าที่จะละทิ้งมรดกโดยสิ้นเชิงและแทนที่ด้วยการมอบอำนาจหรือไม่

b) หากจำเป็นต้องมีการสืบค้นและการเชื่อมโยงแบบ polymorphic รวมถึงคำจำกัดความไดนามิกของคลาสที่เป็นรูปธรรม ณ รันไทม์ ในขณะเดียวกัน คลาสย่อยจะประกาศฟิลด์ใหม่ค่อนข้างน้อย และความแตกต่างหลักกับซูเปอร์คลาสคือพฤติกรรม

และยิ่งไปกว่านั้น คุณได้สนทนาอย่างจริงจังกับ DBA

เข้าร่วมกลยุทธ์

กลยุทธ์นี้มีประสิทธิภาพมากที่สุดในแง่ของความเร็วและข้อจำกัด เหมาะสำหรับในกรณีที่ต้องการการสืบค้นและการเชื่อมโยงแบบ polymorphic แต่คลาสย่อยจะประกาศฟิลด์ใหม่ค่อนข้างมาก

คำเตือน: การตัดสินใจระหว่าง JOINED และ TABLE_PER_CLASS ต้องมีการประเมินแผนการดำเนินการสืบค้นข้อมูลจริง เนื่องจากความกว้างและความลึกของลำดับชั้นการสืบทอดอาจทำให้ค่าใช้จ่ายในการรวม (และเป็นผลให้ประสิทธิภาพการทำงาน) เป็นที่ยอมรับไม่ได้

นอกจากนี้ ควรคำนึงถึงด้วยว่าไม่สามารถใช้คำอธิบายประกอบที่สืบทอดกับอินเทอร์เฟซได้

ชัดเจน

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

มีคำอธิบายประกอบสำหรับสิ่งนี้:

@Polymorphism(type = PolymorphismType.EXPLICIT)

ถ้าเราเพิ่มเข้าไปใน คลาส Client :

@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
@Polymorphism(type = PolymorphismType.EXPLICIT)
class Client extends User {
   String address;
}

จากนั้นการสืบค้น HQL จะละเว้นวัตถุของคลาสนี้เมื่อทำการสืบค้นคลาสพื้นฐาน:

List<User> accounts = session.createQuery("from User").getResultList();

ข้อความค้นหานี้จะส่งคืนรายการ วัตถุ UserและEmployeeแต่ไม่ใช่Client