1. Asosiasi kunci utama dua arah
Asosiasi kunci utama dua arah sebenarnya adalah kasus khusus dari asosiasi kunci primer satu-ke-satu. Namun, konfigurasi <-satu-ke-satu> harus dilakukan dalam file pemetaan di kedua ujung objek yang terkait, dan di samping itu, atribut asosiasi kunci asing asing harus digunakan di salah satu ujung kunci utama peta utama.
Di sini kami juga menggunakan orang dan kartu idk untuk berdiskusi. Seseorang sesuai dengan kartu ID yang unik, dan kartu ID juga secara unik memetakan seseorang, jadi ini menciptakan hubungan asosiasi dua arah. Kunci utama seseorang juga merupakan kunci utama kartu idc, yang merupakan kunci utama dan kunci asing. Hubungan asosiasi ini menjadi pemetaan satu-ke-satu dua arah, yang dapat diekspresikan dalam model hubungan seperti yang ditunjukkan di bawah ini:
Dua tabel dalam gambar menggunakan asosiasi kunci primer. Kunci utama orang adalah kunci utama kartu idc, sehingga mereka membentuk hubungan kendala antara kunci asing ZHU, dan memastikan keunikan, memetakannya menjadi model objek, dan mengubahnya menjadi hubungan satu-ke-satu antara kelas orang dan kartu idcard, seperti yang ditunjukkan pada gambar di bawah ini:
Hubungan satu-ke-satu ini juga disebutkan dalam artikel sebelumnya bahwa tag <-one-one> digunakan, dan pemetaan satu-ke-satu ini adalah dua arah, jadi kita perlu mengkonfigurasi <-satu-ke-satu> antara dua objek pada saat yang sama. Pertama, mari kita lihat kode kelas dan memetakan kode file yang sesuai dengan IDCard.
1. Informasi yang sesuai dengan kartu idcar
Ada hubungan satu-ke-satu antara kelas idcard.java, kelas IDCard dan kelas orang. Oleh karena itu, atribut orang yang sesuai harus ditambahkan ke kelas IDCard. Ini untuk menambahkan atribut yang sesuai ke kunci asing dalam file pemetaan dan mengatur kelas Asosiasi Kunci Asing yang sesuai.
paket com.src.hibernate; IDCard kelas publik {// ID atribut private int id; publik int getId () {return id; } public void setid (int id) {this.id = id; } // Nomor Kartu Atribut Private String Cardno; Public String getCardNo () {return cardno; } public void setCardno (String cardno) {this.cardno = cardno; } // Orang yang sesuai dengan nomor kartu orang pribadi; orang publik getperson () {orang kembali; } public void setPerson (orang orang) {this.person = orang; }}File pemetaan idcard.hbm.xml menambahkan orang atribut kunci asing ke file pemetaan dan menambahkan tag <-satu-ke-satu> yang sesuai. Tujuannya adalah untuk memaksa kelas pembatasan orang untuk mencapai hubungan pemetaan satu-ke-satu. Akhirnya, atur atribut terbatas ke True dalam pemetaan untuk memastikan hubungan kendala paksa.
<? 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> <class name="com.src.hibernate.IdCard" table="IDCARD"> <id name="id" type="int" column="personId"> <generator> <param name="property">person</param> </generator> </id> <property name="cardNo" type="string" column="cardno"></property> <one-to-one name="person" dibatasi = "true"> </-satu-ke-satu> </slement> </hibernate-Mapping>
2. Informasi yang sesuai
Di kelas orang. Alasan yang sama adalah bahwa atribut kelas orang juga ditambahkan ke kelas IDCard.
paket com.src.hibernate; orang kelas publik {// ID Nomor Private Int ID; publik int getId () {return id; } public void setid (int id) {this.id = id; } // Nama nama string pribadi; public string getName () {return name; } public void setName (name string) {this.name = name; } // IDCard Private IDCard IDCard; public idcard getIdcard () {return idcard; } public void setIdcard (idcard idcard) {this.idcard = idcard; }}File Pemetaan Person.hbm.xml, strategi pembuatan kunci utama dalam file ini tidak memiliki persyaratan khusus karena dibatasi oleh kelas IDCard. Kunci utamanya dan kunci asing adalah kunci utama kartu idc. Selain itu, karena ini adalah hubungan satu-ke-satu, tag <-one-to-one> harus ditambahkan ke file pemetaan untuk menunjukkannya.
<? 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> <class name = "com.src.hibernate.person" table = "person"> <id name = "id" type = "int" column = "personid"> <generator> </en generator> </d- name = "name" type = "string" kolom = "personname"> </properti> <poperti! Secara default, ia memuat sesuai dengan kunci utama, yaitu, mendapatkan nilai bidang hubungan dan memuat objek terkait sesuai dengan kunci utama lawan-> <satu-ke-satu nama = "idcard"> </-satu-ke-satu> </slass> </hibernate-mapping>
3. File Pemetaan Hibernate
Setelah kelas di atas dan file pemetaan dikonfigurasi, informasi tentang pemetaan database di hibernate.cfg.xml diperlukan untuk menambahkan dua file konfigurasi ke file konfigurasi hibernate, sehingga item generasi yang sesuai dapat ditemukan ketika menghasilkan database yang sesuai.
<? Xml Version = "1.0" Encoding = "UTF-8"?> <! Doctype Hibernate-Configuration Public "-// Hibernate/Hibernate Configuration Dtd 3.0 // en" "http://hibernate.sourceForge.net/hibernate-configuration-. name = "hibernate.connection.driver_class"> com.mysql.jdbc.driver </property> <property name = "hibernate.connection.url"> jdbc: mysql: // localhost: 3306/hibernate_one2one_pk1 </property </property </property <"Properties =" name = "hibernate.connection.password"> 1234 </prop Property> <Properti name = "hibernate.dialect"> org.hibernate.dialect.mysqldialect </port Property> <pemetaan sumber daya = "com/src/hibernate/person.hbm.xml"/<papping sumber daya "com/sang/person. > </papping> </sesi-Factory> </hibernate-Configuration>
4. Hasilkan Hasil
Setelah konfigurasi selesai, Anda dapat menghasilkan database yang sesuai dari konten di atas. Dalam database, ini akan menghasilkan struktur tabel yang sesuai sesuai dengan konten yang dikonfigurasi, dan ada kunci asing yang sesuai dan bidang kunci utama dalam tabel. Saat menghasilkan struktur tabel, hibernate akan menghasilkan pernyataan SQL yang sesuai di konsol, sebagai berikut:
Alter Table Idcard Drop Kunci Asing FK806F76ABAC038CD8 Table Drop Jika ada tabel drop kartu IDCARD jika ada orang membuat tabel IDCard (PersonID Integer Not Null, Cardno Varchar (255), Kunci Primary (Personid)) Buat tabel (Personid Integer Not Null Auto_INCREMENT, Personname VARCHARCHOME (25 FK806F76ABAC038CD8 (personid), tambahkan kendala FK806F76ABAC038CD8 Kunci Asing (PersonID) Referensi Orang (personid)
Struktur tabel yang dihasilkan seperti yang ditunjukkan pada gambar:
Kunci utama personid dihasilkan di kedua tabel pada saat yang sama, dan itu juga merupakan kunci asing yang sesuai. Ini juga membatasi kunci utama dari dua tabel secara bersamaan dan unik.
5. Tes Menulis dan Muat
Setelah menghasilkan tabel, tulis tabel dan baca data dari tabel, tulis kelas uji yang sesuai, dan tes menggunakan unit tes dan menulis metode uji yang sesuai.
5.1 Tes Tulis
Saat menulis ke database, pastikan untuk mencatat bahwa kedua objek yang ditulis harus dikonversi ke keadaan pelatihan yang sesuai, jika tidak, kesalahan konversi keadaan akan terjadi. Kode tes adalah sebagai berikut:
public void testSave1 () {session session = null; coba {// Buat sesi sesi sesi = hibernateutils.getSession (); // Aktifkan sesi transaksi sesi.begintransaction (); // buat objek orang dan selamatkan orang = orang baru (); orang.setname ("Zhangsan"); session.save (orang); // Buat objek IDCard dan simpan IDCard idcard = new idCard (); idcard.setcardno ("11111111111111"); idcard.setperson (orang); session.save (idcard); // kirimkan transaksi dan memodifikasi Sesi Database.getTransaction (). Commit (); } catch (Exception e) {// Cetak pesan kesalahan E.PrintStackTrace (); // bisnis rollback session.getTransaction (). Rollback (); } akhirnya {// tutup sesi hibernateutils.closession (sesi); }} Data yang dimasukkan ditunjukkan di bawah ini:
5.2 Tes Pemuatan
Tulis metode pemuatan. Karena hubungan asosiasi adalah dua arah, operasi pemuatan yang sesuai harus memuat ujung lainnya melalui satu ujung, yaitu, untuk mendapatkan kelas orang yang sesuai, dan mendapatkan informasi kartu idk yang sesuai melalui kelas orang. Yang sebaliknya juga harus benar, kodenya adalah sebagai berikut:
public void testload1 () {session session = null; coba {// Buat sesi sesi sesi = hibernateutils.getSession (); // Aktifkan sesi transaksi sesi.begintransaction (); // Dapatkan objek orang dan simpan orang = (orang) sesi.load (person.class, 5); System.out.println ("idcard.id:"+person.getIdcard (). GetId ()); System.out.println ("idcard.cardno:"+person.getIdcard (). GetCardNo ()); // Buat objek idcard dan simpan idcard idcard = (idcard) session.load (idcard.class, 5); System.out.println ("person.id:"+idcard.getPerson (). GetId ()); System.out.println ("person.name:"+idcard.getPerson (). GetName ()); // kirimkan transaksi dan memodifikasi basis data session.getTransaction (). Commit (); } catch (Exception e) {// Cetak pesan kesalahan E.PrintStackTrace (); // bisnis rollback session.getTransaction (). Rollback (); } akhirnya {// tutup sesi hibernateutils.closession (sesi); }} Jalankan metode pengujian di atas dan cetak konten yang relevan pada konsol sebagai berikut:
2. Hubungan Kunci Luar Negeri Dua Jalan
Asosiasi Kunci Luar Negeri Diplirectional dapat dipahami sebagai kasus khusus Asosiasi Kunci Asing. Spesialisasi ini terutama karena merupakan korespondensi dua arah. Dalam artikel sebelumnya, disebutkan bahwa jika Anda ingin menambahkan bidang kunci asing ke tabel, Anda dapat menggunakan tag <nother-to-one>, yang akan menghasilkan kolom kunci asing yang sesuai dalam model hubungan. Tag ini harus digunakan jika Anda ingin mencapai asosiasi kunci asing dua arah.
1. Model objek
Pertama -tama mari kita lihat model objek. Orang dan kartu ID adalah hubungan satu-ke-satu. Satu orang sesuai dengan identitas, sehingga multipleks di antara mereka adalah satu-ke-satu, dan korespondensi ini dua arah. Oleh karena itu, model objeknya sama dengan kunci utama dua-ke-satu, seperti yang ditunjukkan pada gambar di bawah ini:
2. Model relasional
Model hubungan yang sesuai akan sangat berubah. Hubungan kunci satu-ke-satu akan menghasilkan kunci asing yang sesuai dalam sebuah tabel. Ketika Anda mendapatkan orang dan kartu ID, itu berarti bahwa akan ada kolom kunci utama dari nomor kartu ID dalam model hubungan, dan situasi satu-ke-satu dua arah terbentuk di antara mereka, seperti yang ditunjukkan pada gambar di bawah ini:
Korespondensi di antara mereka seperti terlihat pada gambar di atas. Ada kunci utama dari tabel kartu Idcard di tabel orang, membentuk hubungan asosiasi kunci satu-ke-satu, dan itu adalah dua arah. Dengan kata lain, kartu idk dapat diperoleh melalui orang, dan orang tersebut juga dapat diperoleh melalui kartu idc.
Kode dalam objek orang dan objek IDCard sama dengan kode objek dalam artikel sebelumnya. Itu tidak terdaftar dalam kode. Satu -satunya perbedaan adalah masalah konfigurasi dalam file pemetaan.
3. Pemetaan file
file pemetaan idcard.hbm.xml. Tabel IDCard bukan tabel utama pemetaan, jadi ketika melakukan pemetaan satu-ke-satu, Anda perlu menggunakan tag <-satu-ke-satu> untuk mengonfigurasinya, dan Anda perlu merumuskan atribut kunci asing dalam model hubungan orang. 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> <class name = "com.src.hibernate.idcard" table = "idcard"> <id name = "id" type = "int"> <generator /> </d> <name properti = "cardno" type = "java.lang.string"> <"name =" cardno " /< /< /" java. properti-ref = "idcard"> </sat satu-ke-satu> </class> </hibernate-Mapping>
File Pemetaan Person.hbm.xml, tabel orang adalah tabel utama pemetaan. Kolom atribut kunci asing perlu ditambahkan ke tabel untuk menunjukkan tabel kartu idc. Oleh karena itu, tag <nother-to-one> perlu digunakan di sini untuk menghasilkan kunci asing yang sesuai dalam objek orang, dan unik juga harus menggunakan unik untuk menunjukkan bahwa atributnya unik.
<? 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> <class name = "com.src.hibernate.person" table = "person"> <id name = "id" type = "int" colum = "personid"> <generator /> </d> <name properti = "name" type = "java.lang.string"> <kolom name = "name" /< /name "" l Manyer = satu-satu = satu-satu name = "name" < /name /name = "name" < /colume = "name" < /name "< /name" < /name "< /name" < /name "< /name =" name "< /name /name < /name /name < /name /name < /name /name < /name /name < /name /name =" unik = "true" not-null = "true"> </tabry-to-one> </class> </hibernate-Mapping>
Konfigurasi file pemetaan objek selesai, dan kemudian model relasional dihasilkan. Pernyataan SQL adalah sebagai berikut:
alter table PERSON drop foreign key FK8C768F55794A52CA drop table if exists IDCARD drop table if exists PERSON create table IDCARD (id integer not null auto_increment, CARDNO varchar(255), primary key (id)) create table PERSON (personId integer not null auto_increment, NAME varchar(255), idCardNo integer not null unique, primary key (personid)) ubah tabel orang tambahkan indeks fk8c768f55794a52ca (idcardno), tambahkan kendala fk8c768f55794a52ca kunci asing (idcardno) Referensi IDCard (ID)
Pernyataan SQL yang dihasilkan adalah pertama -tama tabel yang dibuat. Saat membuat tabel, kolom kunci utama ditentukan. Setelah pembuatan selesai, kedua tabel dimodifikasi untuk menentukan atribut kunci asing untuk membentuk hubungan satu-ke-satu.
Tulis metode pengujian, adopsi uji unit, beban objek dua kelas, dan dapatkan objek lain dari satu ujung objek masing -masing
// Muat objek dan muat objek orang menggunakan objek idcard public void testload1 () {session session = null; coba {session = hibernateutils.getSession (); session.begintransaction (); // Dapatkan objek IDCard dan dapatkan objek orang yang secara unik terkait dengan objek di idcard idcard idcard = (idcard) session.load (idcard.class, 1); System.out.println ("person.id ="+idcard.getPerson (). GetId ()); System.out.println ("idcard.person.name ="+idcard.getPerson (). GetName ()); // Getperson Object dan dapatkan objek kartu idcard yang secara unik dikaitkan dengan itu pada orang orang objek orang = (orang) sesi. System.out.println ("idcard.id:"+person.getIdcard (). GetId ()); System.out.println ("idcard.cardno:"+person.getIdcard (). GetCardNo ()); // komit transaksi session.getTransaction (). Commit (); } catch (Exception e) {E.PrintStackTrace (); session.getTransaction (). rollback (); } akhirnya {hibernateutils.closesession (sesi); }} Konten yang dihasilkan:
Membandingkan dua hubungan pemetaan, kunci utama dan hubungan pemetaan kunci asing adalah hubungan pemetaan dua arah, dan hubungan pemetaan perlu dikonfigurasi pada saat yang sama di kedua ujung objek. Perbedaannya adalah bahwa kunci utama hanya perlu menggunakan <-satu-ke-satu> karena tidak perlu menghasilkan kolom atribut, tetapi strategi generasi kunci utama asing harus digunakan untuk kunci utama tabel dan objek kunci asing ditandai; Strategi generasi kunci asing perlu menggunakan tag <nother-to-one> untuk menghasilkan kolom kunci asing baru.
Kesimpulan
Pemetaan satu-ke-satu dalam asosiasi dua arah telah dibahas sejauh ini. Dua artikel terutama membahas dua penggunaan asosiasi dua arah. Bahkan, itu masih sangat sederhana. Ingatlah untuk menggunakan tag <nother-to-one> jika Anda ingin menghasilkan kunci asing. Jika unik, tambahkan atribut unik. Tag <-satu-ke-satu> hanya menunjukkan hubungan satu-ke-satu. Ini hanya menunjukkan bagaimana satu objek memuat objek lain dan tidak menambahkan kolom baru dalam model hubungan. Artikel berikutnya akan membahas hubungan satu-ke-banyak.