Kali ini mari kita bicara tentang desain hierarkis Hibernate, yang merupakan desain hubungan warisan antara entitas.
Mungkin ini lebih abstrak, mari kita lihat contohnya secara langsung.
1) Mari kita lihat praktik umum pertama dan langsung masukkan kode: Tiga kelas nyata adalah sebagai berikut:
titem kelas publik mengimplementasikan serializable {// oMit get/atur Metode int private int id; manufaktur string pribadi; nama string pribadi; } public class tbook memperluas titem {// oloskan/set Metode private int pagecount; } public class tdvd memperluas titem {// oMit get/atur metode private string regioncode; }
Di sini kita membutuhkan tiga file pemetaan, isinya adalah sebagai berikut:
<class name = "titem" table = "item"> <id name = "id" column = "id" type = "java.lang.integer"> <generator/> </d> <name properti = "name" column = "name" type = "java.lang.string"/> <nama properti = "manufacture" manufacture = "class =" class = "Java. table="Book"> <id name="id" column="id" type="java.lang.Integer"> <generator /> </id> <property name="name" column="name" type="java.lang.String"/> <property name="manufacture" column="manufacture" type="java.lang.String"/> <property name="pageCount" column="pageCount" type = "java.lang.Integer"/> </class> <class name = "tdvd" table = "dvd"> <id nama = "id" kolom = "id" type = "java.lang.integer"> <generator/> </id> <nama properti = "nama" kolom = "nama" java. type = "java.lang.string"/> <properti name = "regioncode" kolom = "regioncode" type = "java.lang.string"/> </slass>
File pemetaan yang sangat biasa, tidak ada perbedaan dari yang sebelumnya.
Mari kita tulis metode tes secara langsung:
public void testSelect () {query query = session.createquery ("from titem"); Daftar daftar = query.list (); Iterator iter = list.iterator (); while (iter.hasnext ()) {system.out.println ("name:"+((((titem) iter.next ()). getName ());}} Perhatikan bahwa di sini kami menggunakan kelas Titem, bukan kelas kata tertentu. Di sini akan secara otomatis mencari subkelas yang diwarisi dari kelas Titem dan menemukan semua hasil. Ini melibatkan polimorfisme. Tag kelas memiliki polimorfisme properti, dan nilai defaultnya implisit, yang berarti bahwa hasilnya dapat ditanyakan tanpa menentukan nama. Jika eksplisit, itu berarti Anda perlu menentukan nama kelas tertentu sebelum Anda dapat menemukan hasil jenis ini.
2) Dalam contoh sebelumnya, kami menggunakan tiga file pemetaan. Ketika kita perlu memodifikasi, kita perlu memodifikasi tiga file pemetaan, yang tidak layak untuk proyek besar. Selain itu, setiap tabel memiliki bidang yang sesuai untuk kelas utama yang sesuai, yang berlebihan. Jadi kami memiliki metode berikut.
Kelas entitas masih sama seperti pada 1). Kami mengubah file pemetaan dari tiga menjadi satu, dan hanya menyimpan file pemetaan titem. Tetapi kita perlu membuat modifikasi yang sesuai, dan kontennya sekarang sebagai berikut:
<class name = "titem" table = "item" polymorphism = "eksplisit"> <id nama = "id" kolom = "id" type = "java.lang.integer"> <generator/> </d> <name properti = "name" column "pabrikan =" Java.Lang.string "/<nama properti =" name "pabrikan" <joined-subclass name="TBook" table="TBOOK"> <key column="id" /> <property name="pageCount" column="pageCount" type="java.lang.Integer" /> </joined-subclass> <joined-subclass name="TDVD" table="TDVD"> <key column="id"/> <property name="regionCode" kolom = "regioncode" type = "java.lang.string"/> </toined-ubclass> </slass>
Di sini, kami hanya memiliki file pemetaan, tetapi ada tag sub-klas yang bergabung, yang menunjukkan bahwa kelas ini mewarisi dari kelas saat ini, <yyy> menunjukkan kunci utama sub-table. Di sini, sub-tabel mengacu pada dua tabel yang sesuai dengan sub-kelas, TBOOK dan TDVD. Hanya bidang di subtabel yang ditentukan dalam properti.
Dengan cara ini, tabel yang dihasilkan setelah kami berjalan adalah sebagai berikut:
Tabel yang sesuai dengan dua subclass hanyalah bidang yang kami tentukan melalui properti. Ini menghindari beberapa bidang dalam tabel, sehingga tabel kata hanya mempertahankan bidangnya yang terpisah. Ketika kelas item berubah, tidak perlu membuat terlalu banyak modifikasi.
3) Mari kita pelajari tentang metode lain untuk mengimplementasikan desain hierarkis, yang dicapai dengan memasukkan bendera ke dalam tabel. Dalam file pemetaan Hibernate, kami mengimplementasikannya melalui tag Descriminator.
Tanpa basa -basi lagi, mari kita lihat contohnya:
Kami memodifikasi file pemetaan titem kemarin menjadi:
<class name = "titem" table = "item" polymorphism = "eksplisit"> <id nama = "id" kolom = "id" type = "java.lang.integer"> <generator/> </d> <diskriminator kolom = "type =" java.lang.string "/<nama properti =" "name". name = "manufacture" column = "manufacture" type = "java.lang.string"/> </class>
Melihat tengah, kami menambahkan tag diskriminator, yang menunjukkan bidang mana dua subclass kami dibedakan oleh.
<Subclass name = "tbook" diskriminator-value = "1"> <name properti = "pagecount" kolom = "pagecount"/> </subclass> <subkelas nama = "tdvd" diskriminator-value = "2"> <nama properti = "regioncode" kolom = "regioncode"/<//</2
Kita melihat dua paragraf ini, yang menunjukkan bahwa ketika nilai bidang yang ditentukan oleh diskriminator adalah 1, itu menunjukkan bahwa itu adalah kelas tbook dan pagecount memiliki nilai; Ketika nilai bidang yang ditentukan oleh diskriminator adalah 2, itu menunjukkan bahwa itu adalah kelas TDVD dan kode regional memiliki nilai.
Dengan cara ini, kita hanya perlu menggunakan satu tabel, yang menunjukkan hubungan antara mereka dan beberapa kelas. Perhatikan bahwa metode ini tidak baik untuk terlalu banyak subclass. Ini akan menyebabkan terlalu banyak bidang di meja utama dan menyebabkan ketidaknyamanan desain tertentu.