1. Pemetaan Asosiasi Satu Jalan Satu-ke
Model objek hubungan satu-ke-banyak sering terlihat dalam kehidupan sehari-hari. Ambil siswa dan kelas sebagai contoh. Ada banyak siswa di kelas, sehingga hubungan antara kelas dan siswa adalah hubungan satu-ke-banyak, dipetakan ke dalam model objek, seperti yang ditunjukkan pada gambar di bawah ini:
Model objek menunjukkan bahwa hubungan satu-ke-banyak ini dipertahankan oleh satu ujung, sehingga pemetaan ke dalam model hubungan berarti bahwa akan ada banyak siswa di bawah bidang kelas, yang membentuk hubungan satu-ke-banyak. Informasi siswa dapat diperoleh melalui kelas. Model hubungan yang sesuai adalah sebagai berikut:
1. Konfigurasi Dasar
Dengan model objek, lalu petakannya ke kode hubungan yang sesuai. Saat melakukan pemetaan hubungan, Anda perlu menambahkan tag <-satu-ke-banyak> di satu ujung. Selain itu, Anda perlu menambahkan atribut set di satu ujung. Ini mendukung pemuatan malas, dan kemudian menambahkan tag set dalam file pemetaan dan menentukan hubungan satu-ke-banyak, sehingga Anda dapat meminta dan mendapatkan beberapa ujung di satu ujung.
Kelas dan file pemetaan:
Ini adalah akhir yang paling penting dari model. Pada akhirnya, Anda perlu menambahkan atribut set yang sesuai dan menambahkan tag set di file konfigurasi. Anda dapat mengonfigurasi objek <-satu-ke-banyak> yang sesuai di tag set. Kode Objek Kelas Spesifik.java adalah sebagai berikut:
paket com.src.hibernate; impor java.util.set; kelas kelas publik {private int id; publik int getId () {return id; } public void setid (int id) {this.id = id; } public string getName () {return name; } public void setName (name string) {this.name = name; } nama string pribadi; // set mendukung pemuatan malas siswa yang ditetapkan; set getStudents public () {return siswa; } public void setStudents (set siswa) {this.students = siswa; }}Atribut SET digunakan dalam objek kelas, tetapi hanya menjelaskan atribut pemuatan yang tertunda dan tidak mengkonfigurasi objek yang sesuai untuk atribut. Objek atribut perlu dikonfigurasi dalam file pemetaan. Anda perlu menambahkan tag set dan menambahkan tag <sat satu-ke-banyak> ke tag set. Kode spesifiknya adalah 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-mapping> <clip clip = "comes" table. "comes. name = "id"> <generator // id> <properti name = "name"/> <set name = "student"> <key column = "classid"> </key> <sat-to-any> </sat-to-many> </set> </class> </hibernate-mapping>
Kode dan pemetaan file dalam objek siswa yang sesuai tidak memerlukan konfigurasi khusus, mereka hanya perlu ditulis sesuai dengan metode penulisan yang biasa. Metode konfigurasi spesifik tidak akan dijelaskan secara rinci, sangat sederhana. Setelah konfigurasi, Anda perlu menghasilkan pernyataan SQL yang sesuai. Saat mengubah model objek menjadi model relasional, Hibernate menghasilkan pernyataan yang sesuai sebagai berikut:
ubah tabel t_student drop kunci asing fk4b9075705e0afefe tabel drop jika ada t_classes tabel drop jika ada t_student membuat tabel t_classes (id integer bukan nol auto_intrement, name varchar (255), kunci primer (id) Buat tabel t_student (id integer noTeger (COLLSGCER (255), kunci primer (ID)) Buat Tabel T_STUDENT (ID NOTEGER NOTEGER NOTEGer Kunci Utama (ID)) Ubah Tabel T_Student Tambahkan Indeks FK4B9075705E0AFEFE (CLASSID), Tambahkan Kendala FK4B9075705E0AFEFE Kunci Asing (ClassID) Referensi T_Classes (ID)
Model hubungan yang sesuai yang dihasilkan ditunjukkan di bawah ini:
Membandingkan pernyataan SQL dan model hubungan, hubungan antara tabel yang sesuai dipertahankan melalui kunci asing. Pertama, buat dua tabel, tentukan kunci utama tabel, dan akhirnya tambahkan hubungan asosiasi kunci satu-ke-banyak.
2. Operasi Dasar
Operasi pada database tidak lebih dari membaca dan menulis, dan modifikasi juga merupakan jenis penulisan. Selanjutnya, mari kita lihat cara menulis dan membaca operasi ke dalam database.
(1) Tulis data:
Saat menulis data, Anda perlu memperhatikan hubungan satu-ke-banyak, jadi Anda perlu menambahkan beberapa kelas siswa saat menambahkannya. Selain itu, karena atribut himpunan yang sesuai ditambahkan ke kelas, Anda harus menggunakan hashset untuk ditambahkan saat menambahkan objek siswa, sehingga Anda dapat mewujudkan hubungan satu-ke-banyak. Kode spesifiknya adalah sebagai berikut:
public void testSave2 () {session session = null; coba {session = hibernateutils.getSession (); session.begintransaction (); Siswa Siswa1 = Siswa Baru (); Student1.setname ("Zhangsan"); session.save (student1); Siswa Siswa2 = Siswa Baru (); student2.setname ("lisi"); session.save (student2); Kelas kelas = kelas baru (); class.setname ("classOne"); Set Siswa = HashSet baru (); Student.Add (Student1); Student.Add (Student2); kelas.setstudents (Siswa); // Data dapat disimpan dengan sukses // tetapi pernyataan pembaruan tambahan akan dikeluarkan untuk mempertahankan hubungan karena itu adalah sesi satu-ke-banyak. session.getTransaction (). Commit (); } catch (Exception e) {E.PrintStackTrace (); session.getTransaction (). rollback (); } akhirnya {hibernateutils.closesession (sesi); }} Kemudian, setelah data yang sesuai yang dihasilkan dengan menjalankan kasus uji di atas ditulis ke database, gambar berikut adalah sebagai berikut:
(2) Baca data:
Operasi tulis relatif sederhana. Anda hanya perlu menambahkan semua objek yang dimuat ke keadaan transien dan menjalankan metode yang sesuai untuk memasukkan konten. Namun, operasi baca yang sesuai akan sedikit lebih rumit. Karena perlu untuk beralih untuk mendapatkan semua objek siswa, hubungan satu-ke-banyak ini tidak terlalu efisien. Kode spesifiknya adalah sebagai berikut:
paket com.test.hibernate; impor java.util.iterator; impor java.util.set; impor com.src.hibernate.*; impor junit.framework.testcase; impor org.hibernate.Session; kelas publik One2ManyTest memperluas testcase {public void testload1 () {session session = null; coba {session = hibernateutils.getSession (); session.begintransaction (); // Dapatkan informasi kelas dengan Kunci Kunci Primer 5 Kelas Kelas = (Kelas) Sesi. Muat (class.class, 5); // cetak kelas informasi sistem.out.println ("class.name ="+class.getName ()); // Atur set siswa dan muat set siswa melalui kelas set siswa = class.getstudents (); // mengulangi set dan mencetak informasi siswa di set untuk (iterator iter = student.iterator (); iter.hasnext ();) {student student = (student) iter.next (); System.out.println ("Student.Name ="+Student.getName ()); } session.getTransaction (). commit (); } catch (Exception e) {E.PrintStackTrace (); session.getTransaction (). rollback (); } akhirnya {hibernateutils.closesession (sesi); }}}Pernyataan dan informasi yang sesuai yang dihasilkan adalah sebagai berikut:
Hibernate: pilih class0_.id sebagai id1_0_, class0_.name as name1_0_ dari t_classes class0_ di mana class0_.id =? class.name = classOne hibernate: pilih siswa0_.classesid sebagai classid1_, student0_.id sebagai id1_, siswa0_.id sebagai id0_0_, siswa0_.name sebagai name0_0_ dari t_student siswa0_ di mana student0_.classsid =? student.name = lisi student.name = zhangsan
2. Pemetaan Asosiasi Day-Many banyak
Di sini kami terus menggunakan siswa dan kelas sebagai contoh. Ada hubungan satu-ke-banyak antara kelas dan siswa. Ada banyak siswa di kelas. Berbeda dengan artikel sebelumnya, hubungan di sini dua arah, yaitu, satu ujung dan satu ujung mempertahankan hubungan pada saat yang sama, sehingga diagram objeknya adalah sebagai berikut:
Diagram model hubungan yang sesuai tidak banyak berubah, karena hubungan di antara mereka adalah dua arah, sehingga kedua ujung model hubungan mempertahankan hubungan hubungan pada saat yang sama dan memetakannya dengan model hubungan seperti yang ditunjukkan pada gambar di bawah ini:
Dalam asosiasi satu-ke-banyak satu arah, file pemetaan hanya perlu dikonfigurasi secara khusus di satu ujung. Gunakan konfigurasi <-satu-ke-banyak> dan gunakan set iterator dalam model objek untuk mengatur model objek yang diepung. Namun, perbedaannya adalah bahwa dalam asosiasi dua arah, asosiasi kunci asing yang sesuai di ujung lain perlu ditambahkan di beberapa ujung. Pada saat ini, hubungan <-Many-on-One> harus digunakan di ujungnya untuk menunjukkan dua arah ini.
1. Pemetaan
Kelas dan siswa juga digunakan sebagai contoh di sini. Konten di ujung kelas sama seperti di atas dan tidak akan berubah, tetapi konfigurasi siswa di beberapa ujung akan berubah, yaitu, tag <nother-to-one> perlu ditambahkan ke file pemetaan.
Konfigurasi file pemetaan student.hbm.xml memerlukan penambahan kolom kunci asing <nother-to-one> tag, dan nama kolom harus konsisten dengan nama kolom kunci asing kelas.hbm.xml. Kode spesifiknya adalah sebagai berikut:
<? Xml Version = "1.0"?> <! Doctype hibernate-mapping public "-// hibernate/hibernate pemetaan dtd 3.0 // en" "http://hibernate.sourceForge.net/hibernate-papping-3.0.dtd"> <hibernate-papping> <"cooming." table="t_student"> <id name="id"> <generator/generator/> </id> <property name="name"/> <!-- Add a new Classes column in the Student on one side, and the column name should be the same as the list of Classes.hbm.xml --> <many-to-one name="classes" column="classesid"></many-to-one> </class> </hibernate-mapping>
Konfigurasi file pemetaan kelas.hbm.xml sama dengan pada artikel sebelumnya. Perlu dicatat bahwa pemetaan atribut SET ditambahkan ke file kelas. Java dan sesuai dengan objek siswa. Oleh karena itu, tag set perlu ditambahkan ke file pemetaan untuk menunjukkan bahwa Iterator Set digunakan dalam model objek. Konfigurasi spesifiknya adalah sebagai berikut:
<? Xml Version = "1.0"?> <! Doctype Hibernate-Mapping Public "-// Hibernate/Hibernate Mapping DTD 3.0 // EN" "http://hibernate.sourceforge.net/hibernate-papping-3.0.dtd"> <hibernate-papping> <"cooming. TABLE = "T_Classes"> <id name = "id"> <generator // id> <properti name = "name"/> <set name = "student" inverse = "true"> <key column = "classid"> </yyy> <seate-t-myy> </one-to-many> </set> </class> </hibernate-papping>
2. Kelas
Konfigurasi file pemetaan secara langsung sesuai dengan kelas, jadi dengan file pemetaan, Anda dapat menulis kelas yang sesuai. Dengan kelas yang sama, Anda dapat tahu cara menulis file pemetaan yang sesuai. Mari kita lihat cara menulis kode kelas yang sesuai.
Kelas Student.java memerlukan penambahan atribut objek kelas terkait ke kelas, dan Anda dapat memperoleh informasi kelas terkait saat memuat siswa.
paket com.src.hibernate; siswa kelas publik {// kelas terkait kelas kelas pribadi kelas; kelas publik getClasses () {return class; } setClasses public void (kelas kelas) {this.classes = kelas; } // ID ID Privat Siswa; publik int getId () {return id; } public void setid (int id) {this.id = id; } // Nama siswa Private String Name; public string getName () {return name; } public void setName (name string) {this.name = name; }} Konten kode spesifik file kelas.java ditampilkan di artikel sebelumnya, dan tidak akan dijelaskan secara rinci di sini.
Dengan model objek, model hubungan dihasilkan. Pernyataan SQL yang dihasilkan adalah sebagai berikut:
ubah tabel t_student drop kunci asing fk4b907570fc588bf4 tabel drop jika ada t_classes drop table jika ada t_student membuat tabel t_classes (id integer not null auto_increment, name varchar (255), kunci primer (id) Buat tabel t_student (id classions nourer (255), kunci primer (id) Buat tabel t_student (ID integrement Integer, Key Primer (ID)) Ubah Tabel T_Student Tambahkan Indeks FK4B907570FC588BF4 (CLASSID), Tambahkan Kendala FK4B907570FC588BF4 Kunci Asing (ClassID) Referensi T_Classes (ID)
3. Operasi Data
Setelah membuat struktur tabel, saya menulis metode pengujian untuk memverifikasi pengoperasian data. Pertama, mari kita lihat penyisipan data dan masukkan data ke dalam struktur tabel. Ada dua situasi saat menulis data. Salah satunya adalah untuk membuat objek kelas terlebih dahulu, menulis objek ke database, kemudian membuat objek siswa, dan menambahkan objek siswa ke objek kelas; Yang lain adalah untuk membuat objek siswa terlebih dahulu, menulis objek siswa ke database, dan kemudian membuat objek kelas untuk menambahkan objek siswa ke objek kelas. Kedua jenis operasi ini berbeda pada akhirnya, jadi mari kita bandingkan.
3.1 Tulis kelas terlebih dahulu dan kemudian tulis siswa
Setelah menulis kelas ke database terlebih dahulu, objek kelas memasuki keadaan sementara dan memiliki baris dalam database. Kemudian tulis objek siswa. Objek siswa akan mencari kunci utama kelas yang sesuai dan menulisnya ke tabel. Oleh karena itu, data dalam model hubungan tidak kosong, dan kode yang disimpan adalah sebagai berikut:
public void testSave () {session session = null; coba {// buat sesi sesi sesi = hibernateutils.getSession (); // buka transaksi session.begintransaction (); // Buat objek kelas dan tulis objek kelas ke kelas kelas basis data = kelas baru (); class.setname ("kelas"); session.save (kelas); // buat siswa 1 objek dan tulis objek siswa ke basis data siswa siswa1 = siswa baru (); Student1.setname ("Zhangsan"); Student1.setClasses (kelas); session.save (student1); // Buat Objek Siswa 2 dan Tulis Objek Siswa ke Database Siswa Siswa2 = Siswa Baru (); student2.setname ("lisi"); student2.setClasses (kelas); session.save (student2); session.getTransaction (). Commit (); } catch (Exception e) {E.PrintStackTrace (); session.getTransaction (). rollback (); } akhirnya {hibernateutils.closesession (sesi); }} Daftar informasi yang sesuai dalam database Tulis adalah sebagai berikut:
3.2 Tuliskan siswa terlebih dahulu dan kemudian kelas
Pertama -tama tulis siswa ke dalam database. Pada saat ini, karena tabel siswa perlu mendapatkan informasi kunci utama dari kolom kelas yang sesuai, tetapi karena informasi kelas dikonversi ke keadaan sementara, akan ada nilai nol saat menulis informasi siswa. Kodenya adalah sebagai berikut:
Tampilan database yang sesuai setelah menulis adalah sebagai berikut:
Membandingkan dua operasi penulisan, hasil yang berbeda muncul karena urutan kedua menulis berbeda, tetapi karena itu adalah asosiasi dua arah, tidak ada pengecualian yang terjadi selama penulisan.
4. Baca operasi
Dibandingkan dengan data menulis, data membaca menjadi sangat sederhana. Karena ini adalah asosiasi dua arah, pembacaan data juga dua arah. Informasi dari ujung lain dapat dibaca dari ujung apa pun, seperti yang ditunjukkan dalam kode berikut:
public void testload1 () {session session = null; coba {session = hibernateutils.getSession (); session.begintransaction (); // Baca informasi siswa melalui kelas kelas kelas = (kelas) session.load (class.class, 1); System.out.println ("class.name ="+class.getName ()); Set Student = classe.getstudents (); untuk (iterator iter = student.iterator (); iter.hasnext ();) {student student = (student) iter.next (); System.out.println ("Student.Name ="+Student.getName ()); } // Baca informasi kelas melalui informasi siswa siswa Stu = siswa baru (); Stu = (siswa) session.load (student.class, 1); System.out.println ("Muat informasi kelas melalui kelas siswa.id ="+stu.getClasses (). GetId ()); session.getTransaction (). Commit (); } catch (Exception e) {E.PrintStackTrace (); session.getTransaction (). rollback (); } akhirnya {hibernateutils.closesession (sesi); }}Jalankan pernyataan pengujian di atas dan informasi pernyataan yang sesuai yang dihasilkan adalah sebagai berikut:
Hibernate: pilih class0_.id sebagai id1_0_, class0_.name as name1_0_ dari t_classes class0_ di mana class0_.id =? class.name = class hibernate: pilih siswa0_.classesid sebagai classid1_, student0_.id sebagai id1_, siswa0_.id sebagai id0_0_, siswa0_.name sebagai name0_0_, student0_.classid sebagai classid0_0_ dari t_student siswa0_ di mana siswa0.classsid =? student.name = lisi student.name = zhangsan
Memuat informasi kelas oleh kelas siswa.id = 1