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