Pemetaan kunci primer komposit memerlukan penggunaan tag <composite-id> dalam file konfigurasi pemetaan. Tag ini mengacu pada menentukan kelas sebagai kunci primer senyawa yang sesuai. Atribut namanya perlu menentukan nilai properti yang didefinisikan dalam file kelas dan menambahkan sub-label <Eny-property> ke tag.
Catatan: Jika Anda ingin menggunakan pemetaan komposit, Anda harus menempatkan kunci primer komposit dalam satu kelas, yaitu, atribut kunci primer komposit dan atribut lainnya dibagi menjadi dua kelas, dan kelas kunci primer komposit mengimplementasikan antarmuka yang dapat diserializable, yang termasuk dalam java.io.
Kunci utama dari hubungan pemetaan dari kunci primer komposit terdiri dari beberapa kolom, yang sesuai dengan tabel data cukup sederhana, seperti yang ditunjukkan pada gambar di bawah ini:
1. File kelas
Di sini kita mengambil tabel pada gambar di atas sebagai contoh. Dalam tabel, dua bidang dan durasi bergabung untuk membentuk kunci utama tabel. Oleh karena itu, kelas -kelas baru yang dibagi masing -masing dinamai fiscalyearperiod dan fiscalyearperiodpk. Di antara mereka, kelas fiscalyearperiod merangkum atribut kunci utama tabel, kelas fiscalyearperiod merangkum atribut lain, dan kelas fiscalyearperiod.
1.1 fiscalyearperiod.java
Kelas merangkum properti dasar, dan merangkum kelas fiscalyearperiodpk sebagai atribut ke dalam kelas, dan mengkonfigurasi pemetaan yang sesuai dalam file konfigurasi, sebagai berikut:
paket com.src.hibernate; impor java.sql.date; kelas publik fiscalyearperiod {// waktu utama primer fiscalyearperiodpk fiscalyearperiodpk; fiscalyearperiodpk publik getFiscalyearperiodpk () {return fiscalyearperiodpk; } public void setFiscalyeArperIoDPK (fiscalyearperiodpk fiscalyearperiodpk) {this.fiscalyearperiodpk = fiscalyearperiodpk; } // Tanggal mulai tanggal pribadi dimulai; tanggal publik getBegindate () {return begindate; } public void setBegindate (tanggal begindate) {this.begindate = begindate; } // Tanggal Akhir Tanggal Privat Enddate; tanggal publik getEndDate () {return endDate; } public void setendDate (tanggal endDate) {this.endDate = endDate; } // stage time private string periodsts; Public String getperiodsts () {return palialS; } public void setPeriodSTS (string palifSTS) {this.periodsts = periodsts; }} 1.2 Fiscalyearperiodpk.java
Merangkum atribut kunci utama. Kelas ini dipisahkan dari kelas fiscalyearperiod. Ini berisi atribut kunci utama dasar dan perlu mengimplementasikan antarmuka yang dapat diseriali. Kelas ini akan dipetakan ke tag <composite-id> di file konfigurasi untuk menentukan kelas. Kodenya adalah sebagai berikut:
paket com.src.hibernate; impor java.io.serializable; Kelas Publik FiscalyearperIoDPK mengimplementasikan serializable {// tahun int private int fiscalyear; publik int getFiscalyear () {return fiscalyear; } public void setFiscalyear (int fiscalyear) {this.fiscalyear = fiscalyear; } // durasi private int fiscalperiod; publik int getFiscalperiod () {return fiscalperiod; } public void setFiscalperiod (int fiscalperiod) {this.fiscalperiod = fiscalperiod; }} 2. File Konfigurasi
Berikut adalah pertanyaan mana dari dua kelas yang perlu menambahkan file pemetaan? Karena tag <composite-id> digunakan, Anda hanya perlu menambahkan pemetaan untuk kelas fiscalyearperiod, tambahkan tag kunci primer komposit yang sesuai ke file pemetaan, dan tambahkan atribut kunci utama yang sesuai ke tag, sebagai berikut:
<? XML Versi = "1.0"?> <! Doctype Hibernate-Mapping Public "-// Hibernate/Hibernate Mapping DTD 3.0 // EN" "http://hibernate.sourceForge.net/hibernate-papping-3.0.dtd"> <hibernate-papping> <class name = "coomis.sal Table = "t_fiscal_year_period_pk"> <composite-id name = "fiscalyearpk"> <Key-property name = "fiscalyear"> </key-property> <Key-Properties name = "fiscalperioD"> </Key-Properties> </composite name = "fiscalperiod"> </Key-Properties> </composition name = "date =" date "date/date/date/date/end end =" date "date" date "date =" end "date =" type = "date"/> <properti name = "endDate" type = "date"/> <properti name = "periodsts"/> </slass> </hibernate-mapping>
File di atas dihasilkan untuk menghasilkan tabel database yang sesuai, dan pernyataan SQL yang dihasilkan adalah sebagai berikut:
Tabel drop jika ada t_fiscal_year_period_pk membuat tabel t_fiscal_year_period_pk (integer fiscalyear bukan nol, fiscalperiod integer bukan nol, tanggal awal, tanggal akhir, periode varchar (255), kunci primer (fiscalperear, fiscalperear))
Struktur tabel yang sesuai adalah sebagai berikut:
3. Operasi Data
Setelah file pemetaan yang sesuai dikonfigurasi, operasi data yang sesuai menjadi sangat sederhana. Pertama, mulailah dengan menulis data. Saat menulis data ke database, dua kelas akan ditulis ke database secara bersamaan. Oleh karena itu, kedua kelas harus dikonversi menjadi keadaan sementara. Oleh karena itu, saat menyimpan, Anda harus terlebih dahulu menyimpan objek fiscalyearperiod ke database terlebih dahulu, dan kemudian secara otomatis akan mengaitkan atribut komposit dan menyimpan informasi ke database.
3.1 Operasi Tulis
Metode operasi tulis sama dengan metode tulis sebelumnya. Anda perlu mendefinisikan dua objek dan kemudian menyimpan informasi objek yang sesuai ke dalam database. Kodenya adalah sebagai berikut:
public void testSave1 () {// mendeklarasikan sesi sesi sesi sesi = null; coba {// dapatkan sesi sesi sesi = hibernateutils.getSession (); // buka sesi sesi.begintransaction (); // Buat objek komposit fiscalyearperiodpk fiscalyearperiodpk = fiscalyearperiodpk () baru; fiscalyearperiodpk.setfiscalperiod (2014); fiscalyearperiodpk.setfiscalyearyear (2012); // Buat objek fiscalyearperiod fiscalyearperiod = fiscalyearperiod baru (); fiscalyearperiod.setfiscalyearperiodpk (fiscalyearperiodpk); session.save (fiscalyearperiod); // Kirim sesi sesi sesi.getTransaction (). Commit (); } catch (Exception e) {E.PrintStackTrace (); session.getTransaction (). rollback (); } akhirnya {hibernateutils.closesession (sesi); }}Jalankan metode uji yang sesuai, dan pernyataan SQL yang dihasilkan adalah sebagai berikut:
Hibernate: insert into t_fiscal_year_period_pk (beginDate, endDate, periodSts, fiscalYear, fiscalPeriod) values (?, ?, ?, ?, ?) Tampilan database yang sesuai:
3.2 Operasi pemuatan
Metode pemuatan yang sesuai akan berbeda dari sebelumnya, karena kunci utama dalam tabel adalah properti majemuk, sehingga kelas perlu dibuat. Saat memuat data, Anda perlu membuat objek kunci utama. Pada saat ini, kunci utama adalah objek, dan Anda perlu menetapkan nilai ke properti objek untuk mendapatkan objek. Kodenya adalah sebagai berikut:
public void testLoad1 () {// mendeklarasikan sesi sesi sesi sesi = null; coba {// dapatkan sesi sesi sesi = hibernateutils.getSession (); // buka sesi sesi.begintransaction (); // Buat objek komposit fiscalyearperiodpk fiscalyearperiodpk = fiscalyearperiodpk () baru; fiscalyearperiodpk.setfiscalperiod (2014); fiscalyearperiodpk.setfiscalyear (2012); Fiscalyearperiod fiscalyearperiod = (fiscalyearperiod) sesi. System.out.println ("Tanggal Mulai:"+fiscalyearperiod.getBegindate ()); // kirim sesi sesi.getTransaction (). Commit (); } catch (Exception e) {E.PrintStackTrace (); session.getTransaction (). rollback (); } akhirnya {hibernateutils.closesession (sesi); }}Hasilnya adalah sebagai berikut:
Hibernate: Pilih fiscalyear0_.fiscalyear sebagai fiscalyear0_0_, fiscalyear0_.fiscalperiod sebagai fiscalpe2_0_0_, fiscalyear0_.begindate sebagai begindate0_0_, fiscalyear0_.enddate as endDate0_, fiscalyear0_.endDate as endDate0_, fiscalyear0_. t_fiscal_year_period_pk fiscalyear0_ di mana fiscalyear0_.fiscalyear =? dan fiscalyear0_.fiscalperiod =? Tanggal mulai: 2013-10-12
4. Contoh komprehensif
Tabel departemen perusahaan yang lebih besar (hibernate_dept_compositepk) terdiri dari bidang -bidang seperti area (area), nama departemen (nama), jumlah orang di departemen (empcount), dan waktu pembentukan (ulang tahun). Kami menggunakan area dan nama departemen sebagai kunci utama bersama:
4.1 Kelas Target: Departemen.java
departemen kelas publik { /** Abstrak atribut asosiasi kunci utama dan tuliskan ke kelas secara terpisah* /// area string pribadi; // nama string pribadi; / ** Mempersiapkan objek kelas kunci utama sebagai variabel anggota*/ departemen departemen swasta; empcount int pribadi; ulang tahun kencan pribadi; // public string getarea () {// Area pengembalian; //} // // public void setarea (area string) {// this.area = area; //} // // public string getName () {// return name; //} // // public void setName (name string) {// this.name = name; //} public int getempcount () {return empcount; } public void setempcount (int empcount) {this.empcount = empcount; } tanggal publik getBirthday () {kembali ulang tahun; } public void setBirthday (tanggal ulang tahun) {this.birthday = ulang tahun; } Departemen UmumPK getDepartmentPk () {return departmentPk; } public void setDepartmentPk (departemen Departemenpk) {this.departmentpk = departmentPk; }} 4.2 Kelas Kunci Utama: Departemenpk.java
Public Class DepartmentPk mengimplementasikan serializable {private static final long serialversionuid = -288002855915204255l; area string pribadi; nama string pribadi; /** * Metode HashCode Timpa (dinilai berdasarkan area dan nama) *///@override public int hashCode () {final int prime = 31; Hasil int = 1; hasil = hasil * prime + ((area == null)? 0: Area.HashCode ()); result = prime * result + ((name == null)? 0: name.hashcode ()); hasil pengembalian; } / ** * overwrite sama (dinilai berdasarkan area dan nama) * / @Override public boolean sama (objek obj) {if (this == obj) return true; if (obj == null) mengembalikan false; if (getClass ()! = obj.getClass ()) mengembalikan false; final departmentpk Other = (departmentPk) obj; if (area == null) {if (Other.area! = null) return false; } lain jika (! Area.Equals (Other.area)) Return False; if (name == null) {if (Other.name! = null) return false; } else if (! name.equals (Other.name)) return false; Kembali Benar; } public string getarea () {Area return; } public void setarea (Area String) {this.area = Area; } public string getName () {return name; } public void setName (name string) {this.name = name; }} 4.3 Pemetaan File Department.hbm.xml
<? xml versi = "1.0"?> <! Doctype hibernate-mapping public "-// hibernate/hibernate pemetaan dtd 3.0 // en" "http://hibernate.sourceforge.net name = "com.yangfei.hibernate.mpositepk.entity.department" Table = "hibernate_dept_compositepk"> <!-Kunci utama Union-> <!-Nama mengacu pada atribut objek kunci utama-> <nama komposit-proPOPER = "Departmentpk"> <!-Di sini adalah properti utama-"proPOPERT" name = "Departmertpk"> <!-Di sini adalah properti kunci utama-> <"ID-id =" Departmentpk "> <!-Di sini adalah properti utama-" ProPOPERT /IIDEPER <" /> < /composite-id> <!-properti lain-> <name properti = "empcount" length = "4" /> <properti name = "ulang tahun" type = "date" /> < /class> </hibernate-mapping>
4.4 File Konfigurasi Hibernate Hibernate.cfg.xml
<? Xml Version = '1.0' Encoding = 'UTF-8'?> <! Doctype Hibernate-Configuration Public "-// Hibernate/Hibernate Configuration Dtd 3.0 // en" "http://hibernate.sourceForge.net/hibernate-configuration-3.s. -> <hibernate-konfigurasi> <sesi-factory> <name properti = "dialect"> org.hibernate.dialect.oracle9dialect </preate> <name properti = "connection.url"> jdbc: oracle: tipis:@127.0.0.1: 1521: orcl10 </name property = " name = "connection.password"> yf123 </pruptent> <property name = "connection.driver_class"> oracle.jdbc.driver.oracledriver </property> <name properti = "hibernate.show_sql"> true </permapping sumber daya = "com/yangfeei/hibernate/hibernate/comprect/compress/compress/compress/comp." </sesi-Factory> </hibernate-konfigurasi>
4.5 Kelas Tes: DepartmentTest.java
Public Class DepartmentTest memperluas testcase { / *** Tes Insert Data* / public void save () {session session = hibernateutils.getSession (); Transaksi t = session.begintransaction (); coba {departemen dept = departemen baru (); / ** menghasilkan objek kunci utama*/ departmentpk deptpk = departmentPk baru (); deptpk.setarea ("beijing"); Deptpk.setname ("Departemen R&D"); dept.setDepartmentPk (deptpk); Dept.setempcount (100); dept.setBirthday (tanggal baru ()); session.save (dept); t.Commit (); } catch (hibernateException e) {e.printstacktrace (); t.rollback (); } akhirnya {hibernateutils.closesession (sesi); }} / *** data muatan uji* / public void load () {session session = hibernateutils.getSession (); Transaksi t = session.begintransaction (); Coba { / ** Hasilkan Objek Kunci Utama* / Departemen Deptpk = Departemen Baru (); deptpk.setarea ("beijing"); Deptpk.setname ("Departemen R&D"); Departemen dept = (departemen) session.load (department.class, deptpk); System.out.println (dept.getDepartmentPk (). Getarea ()+","+dept.getDepartmentPk (). GetName ()+","+dept.getempcount ()+","+dept.getBirthday ()); } catch (hibernateException e) {e.printstacktrace (); t.rollback (); } akhirnya {hibernateutils.closesession (sesi); }} / *** data modifikasi uji* / pembaruan public void () {session session = hibernateutils.getSession (); Transaksi t = session.begintransaction (); Coba { / ** Hasilkan Objek Kunci Utama* / Departemen Deptpk = Departemen Baru (); deptpk.setarea ("beijing"); Deptpk.setname ("Departemen R&D"); Departemen emp = (departemen) sesi.load (department.class, deptpk); System.out.println (emp.getDepartmentPk (). Getarea ()+","+emp.getDepartmentPk (). GetName ()+","+emp.getempcount ()+","+emp.getBirthday ()); emp.setempcount (100); session.saveorupdate (emp); / ** menghasilkan objek kunci utama*/ departemen deptpk2 = departmentPk baru (); deptpk2.setarea ("beijing"); Deptpk2.setname ("Departemen R&D"); Departemen dept = (departemen) session.load (department.class, deptpk2); System.out.println (dept.getDepartmentPk (). Getarea ()+","+dept.getDepartmentPk (). GetName ()+","+dept.getempcount ()+","+dept.getBirthday ()); t.Commit (); } catch (hibernateException e) {e.printstacktrace (); t.rollback (); } akhirnya {hibernateutils.closesession (sesi); }} / *** Uji data hapus* / public void delete () {session session = hibernateutils.getSession (); Transaksi t = session.begintransaction (); Coba { / ** Hasilkan Objek Kunci Utama* / Departemen Deptpk = Departemen Baru (); deptpk.setarea ("beijing"); Deptpk.setname ("Departemen R&D"); Departemen dept = (departemen) session.load (department.class, deptpk); session.delete (dept); t.Commit (); } catch (hibernateException e) {e.printstacktrace (); t.rollback (); } akhirnya {hibernateutils.closesession (sesi); }}}