Katrangan
Saben strategi lan teknik ing ndhuwur nduweni kaluwihan lan kekurangan dhewe. Rekomendasi umum kanggo milih strategi tartamtu bakal katon kaya iki:
Strategi TABLE_PER_CLASS adhedhasar UNION
Strategi iki paling apik dipilih yen pitakon lan asosiasi polimorfik ora dibutuhake. Yen sampeyan arang nindakake (utawa ora nindakake kabeh) "pilih pangguna saka pangguna pangguna". Yen sampeyan ora duwe kelas Entitas sing nuduhake pangguna, iki minangka pilihan sing paling apik (amarga sampeyan isih bisa nambah pitakon lan asosiasi polimorfik sing dioptimalake).
strategi SINGLE_TABLE
Strategi iki kudu digunakake:
a) Mung kanggo tugas prasaja. Ing kahanan sing normalisasi lan kendala NOT NULL kritis, strategi #3 (GABUNG) kudu luwih disenengi. Iku ndadekake pangertèn kanggo mikir bab apa ing kasus iki ora worth rampung nilar warisan lan ngganti karo delegasi.
b) Yen pitakon lan asosiasi polimorfik dibutuhake, uga definisi dinamis saka kelas konkrit nalika mlaku. Ing wektu sing padha, subkelas nyatakake sawetara lapangan anyar, lan prabédan utama karo superclass yaiku prilaku.
Lan ing ndhuwur iku, sampeyan duwe obrolan serius karo DBA.
strategi GABUNGAN
Strategi iki paling efisien ing babagan kacepetan lan KONSTRAIN. Cocog ing kasus sing mbutuhake pitakon lan asosiasi polimorfik, nanging subkelas nyatakake akeh lapangan anyar.
Ati-ati ing kene: kaputusan antarane JOINED lan TABLE_PER_CLASS mbutuhake evaluasi rencana eksekusi query ing data nyata, amarga jembar lan ambane hirarki warisan bisa nggawe biaya gabung (lan, minangka asil, kinerja) ora bisa ditampa.
Kapisah, kudu digatekake manawa anotasi warisan ora bisa ditrapake ing antarmuka.
EXPLICIT
Ana uga kahanan ing ngendi sampeyan duwe hierarki kelas Entitas kanthi strategi panyimpenan sing dienggo bareng ing basis data. Nanging kanthi alesan apa wae, sampeyan ora pengin sawetara kelas hierarki dibalekake nalika pitakonan digawe ing kelas dasar.
Ana anotasi kanggo iki:
@Polymorphism(type = PolymorphismType.EXPLICIT)
Yen kita nambahake menyang kelas Klien :
@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;
}
Banjur pitakon HQL bakal nglirwakake obyek saka kelas iki nalika takon kelas dasar:
List<User> accounts = session.createQuery("from User").getResultList();
Pitakonan iki bakal ngasilake dhaptar obyek Panganggo lan Karyawan , nanging dudu Klien .