Pemetaan banyak-ke-satu
Asosiasi banyak-ke-satu adalah hubungan asosiasi yang paling umum, di mana suatu objek dapat dikaitkan dengan banyak objek. Misalnya, satu objek alamat yang identik dapat dikaitkan dengan objek banyak karyawan.
Tentukan tabel RDBMS:
Pertimbangkan situasi di mana kita membutuhkan catatan karyawan untuk disimpan dalam tabel karyawan, yang akan memiliki struktur berikut:
Buat karyawan Table (id int not null auto_increment, first_name varchar (20) default null, last_name varchar (20) default null, gaji int default null, alamat int not null, kunci primer (id));
Selain itu, banyak karyawan dapat memiliki alamat yang sama, sehingga asosiasi ini dapat disajikan menggunakan banyak asosiasi satu-ke-satu. Kami menyimpan informasi yang terkait dengan alamat dalam tabel terpisah dengan struktur berikut:
Buat Alamat Tabel (id int not null auto_increment, street_name varchar (40) default null, city_name varchar (40) null default, state_name varchar (40) default null, zipcode varchar (10) nol default, kunci utama (id)));
Buat tabel RBDMS secara bersamaan dan biarkan mereka mempersiapkan implementasi berikutnya.
Tentukan Kelas Pojo:
Mari kita terapkan karyawan kelas POJO yang akan digunakan untuk memegang variabel objek dan jenis alamatnya dengan tabel karyawan.
impor java.util.*; karyawan kelas publik {private int id; Private String FirstName; Private String LastName; gaji int pribadi; alamat alamat pribadi; Pegawai publik () {} Pegawai publik (String fname, String lname, int gaji, alamat alamat) {this.firstname = fname; this.lastname = lname; this.salary = gaji; this.address = alamat; } public int getId () {return id; } public void setid (int id) {this.id = id; } public String getFirstName () {return firstName; } public void setFirstName (String first_name) {this.firstname = first_name; } public String getLastName () {return lastName; } public void setLastName (string last_name) {this.lastname = last_name; } public int getSalary () {return gaji; } public void setSalary (int gaji) {this.salary = gaji; } alamat publik getAddress () {alamat kembali; } public void setAddress (alamat alamat) {this.address = alamat; }}Kita perlu menentukan tabel alamat yang sesuai sehingga objek alamat dapat menyimpan dan mengambil kelas POJO lain di tabel alamat.
impor java.util.*; alamat kelas publik {private int id; Jalan String Pribadi; Private String City; keadaan string pribadi; zipcode string pribadi; alamat publik () {} alamat publik (String Street, String City, String State, String ZipCode) {this.street = street; this.city = City; this.state = state; this.zipcode = zipcode; } public int getId () {return id; } public void setid (int id) {this.id = id; } public string getStreet () {return street; } public void setStreet (String street) {this.street = street; } public string getCity () {return city; } public void setCity (string city) {this.city = city; } public String getState () {return state; } public void setState (state string) {this.state = state; } public String getZipCode () {return zipcode; } public void setZipCode (string zipcode) {this.zipCode = zipcode; }} Tentukan file pemetaan hibernate:
Kembangkan file pemetaan kami yang menginstruksikan hibernate cara mendefinisikan kelas peta ke tabel basis data. <-banyak-ke-satu> elemen pemrosesan akan digunakan untuk mendefinisikan aturan untuk membangun hubungan banyak-ke-satu antara entitas karyawan dan alamat.
<? XML Versi = "1.0" encoding = "utf-8"?> <! Doctype hibernate-mapping public "-// hibernate/hibernate pemetaan dtd // en" "http://www.hibernate.org/dtd/hibernate-papping-3.0 <meta attribute = "class-description"> Kelas ini berisi detail karyawan. </meta> <id name = "id" type = "int" column = "id"> <generator/> </d> <name properti = "FirstName" column = "first_name" type = "string"/> <properti name = "lastname" column = "last_name" type = "string"/> <properti nama = "gaji" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" last "name =" last "name =" last last_name = "string"/> <properti name = "gaji" "" "" "" "" "" "" "" "TYPE" TYPE "INT"/> <properti name = "gaji" "" "" "" "" "" "" "" "" "" "" "" "" last "ALCHOLD" TYPE "TYPE" INT "TYPE" TYPE "TING" not-null = "true"/> </class> <class name = "address" table = "address"> <meta attribute = "class-description"> kelas ini berisi detail alamat. </meta> <id name = "id" type = "int" column = "id"> <generator/> </d> <name properti = "street" kolom = "street_name" type = "string"/> <name properti = "city" kolom = "city_name" type = "string"/> <nama properti = "state" kolom = "state_name" zip = "string"/> <Properti nama = "state" kolom = "state_name" tipe = "" string "/> <Properti nama =" state "kolom =" state_name "tipe =" "string" " type = "string"/> </slass> </hibernate-Mapping>
Format <ClassName> .hbm.xml dalam file pemetaan yang harus disimpan. Simpan file karyawan.hbm.xml dalam file pemetaan. Sudah terbiasa dengan sebagian besar detail pemetaan, tetapi mari kita lihat semua elemen dalam file pemetaan lagi:
Dokumen yang dipetakan adalah dokumen XML dengan <hibernate-Mapping> sebagai elemen root yang sesuai dengan setiap kelas yang berisi 2 elemen <slass>.
Elemen <slass> digunakan untuk menentukan pemetaan spesifik tabel basis data dari kelas Java. Nama Kelas Java Menentukan atribut nama elemen kelas dan Table Attribute Database Table Name ditentukan.
Elemen <meta> adalah elemen opsional yang dapat digunakan untuk membuat deskripsi kelas.
Elemen <d> memetakan atribut ID unik di kelas ke kunci utama tabel database. Atribut nama elemen ID mengacu pada kelas atribut dan atribut kolom mengacu pada kolom dalam tabel database. Atribut Type menyimpan tipe pemetaan hibernate, yang akan dikonversi dari Java ke tipe data SQL.
Nilai kunci utama dalam elemen <Genator> dalam elemen ID digunakan untuk menghasilkan secara otomatis. Atur atribut kelas dari elemen yang dihasilkan untuk secara alami membiarkan hibernasi mengambil algoritma apakah itu identitas, urutan atau hilo untuk membuat kunci primer sesuai dengan kemampuan dukungan dari database yang mendasarinya.
Elemen <property> digunakan untuk memetakan properti kelas Java ke kolom dalam tabel database. Atribut nama elemen mengacu pada kelas atribut dan atribut kolom mengacu pada kolom dalam tabel database. Atribut Type menyimpan tipe pemetaan hibernate, yang akan dikonversi dari Java ke tipe data SQL.
<Many-to-one> Elemen pemrosesan digunakan untuk mengatur hubungan antara karyawan dan entitas yang ditangani. Atribut nama diatur ke variabel yang ditentukan dalam kelas induk, dalam kasus kami adalah alamatnya. Atribut kolom digunakan untuk nama kolom dalam set karyawan tabel induk.
Akhirnya, kami akan membuat metode utama () dari kelas aplikasi untuk menjalankan aplikasi. Kami akan menggunakan aplikasi ini untuk menyimpan beberapa karyawan bersama dengan alamat mereka untuk merekam alamat mereka, dan kemudian kami akan mengajukan permohonan operasi CRUD pada catatan.
impor java.util.*; impor org.hibernate.hibernateException; impor org.hibernate.Session; Impor org.hibernate.transaction; impor org.hibernate.SessionFactory; impor org.hibernate.cfg.configuration; Public Class ManagementAmployee {Private Static Session Factory; public static void main (string [] args) {try {factory = new configuration (). configure (). buildSessionFactory (); } catch (Throwable ex) {System.err.println ("Gagal membuat objek SesionFactory." + Ex); Lempar pengecualian baruinitializerError (EX); } Manajemen Me = Manajemen baru (); / * Mari kita memiliki satu objek alamat */ alamat alamat = me.addaddress ("Kondapur", "hyderabad", "ap", "532"); / * Tambahkan catatan karyawan dalam database */ integer empid1 = me.addemployee ("manoj", "kumar", 4000, alamat); / * Tambahkan catatan karyawan lain dalam database */ integer empid2 = me.addemployee ("dilip", "kumar", 3000, alamat); / * Daftar semua karyawan */ me.listemployee (); / * Perbarui catatan gaji karyawan */ me.updateemployee (empid1, 5000); / * Hapus seorang karyawan dari database */ me.deleTeeMarder (empid2); / * Daftar semua karyawan */ me.listemplees (); } / * Metode untuk menambahkan catatan alamat dalam database * / alamat alamat publikAddress (String Street, String City, String State, String ZipCode) {session session = factory.opensession (); Transaksi tx = null; Integer addressId = null; Alamat Alamat = NULL; coba {tx = session.begintransaction (); alamat = alamat baru (jalan, kota, negara bagian, kode zipcode); addressId = (integer) session.save (alamat); tx.commit (); } catch (hibernateException e) {if (tx! = null) tx.rollback (); e.printstacktrace (); } akhirnya {session.close (); } alamat pengembalian; } / * Metode untuk menambahkan catatan karyawan dalam database * / addemployee integer publik (string fname, string lname, int gaji, alamat alamat) {session session = factory.opensession (); Transaksi tx = null; Integer Pegawai = NULL; coba {tx = session.begintransaction (); Karyawan Karyawan = Karyawan Baru (nama, lname, gaji, alamat); karyawan = (integer) session.save (karyawan); tx.commit (); } catch (hibernateException e) {if (tx! = null) tx.rollback (); e.printstacktrace (); } akhirnya {session.close (); } mengembalikan karyawan; } / * Metode untuk mencantumkan semua detail karyawan * / public void listeMiryees () {session session = factory.opensession (); Transaksi tx = null; coba {tx = session.begintransaction (); Daftar karyawan = session.createqueery ("dari karyawan"). Daftar (); untuk (iterator iterator = karyawan.iterator (); iterator.hasnext ();) {karyawan karyawan = (karyawan) iterator.next (); System.out.print ("Nama Depan:" + karyawan.getFirstName ()); System.out.print ("Nama Belakang:" + karyawan.getLastName ()); System.out.println ("Gaji:" + karyawan.getSalary ()); Alamat add = usaha.getAddress (); System.out.println ("Alamat"); System.out.println ("Street:" + Add.getStreet ()); System.out.println ("City:" + Add.getCity ()); System.out.println ("State:" + Add.getState ()); System.out.println ("ZipCode:" + add.getZipCode ()); } tx.Commit (); } catch (hibernateException e) {if (tx! = null) tx.rollback (); e.printstacktrace (); } akhirnya {session.close (); }} / * Metode untuk memperbarui gaji untuk karyawan * / public void updateMireee (integer employeeid, int gaji) {session session = factory.opensession (); Transaksi tx = null; coba {tx = session.begintransaction (); Pegawai Karyawan = (karyawan) sesi. karyawan.setsalary (gaji); session.update (karyawan); tx.commit (); } catch (hibernateException e) {if (tx! = null) tx.rollback (); e.printstacktrace (); } akhirnya {session.close (); }} / * Metode untuk menghapus karyawan dari catatan * / public void deleteEmployee (integer usaha) {session session = factory.opensession (); Transaksi tx = null; coba {tx = session.begintransaction (); Pegawai Karyawan = (karyawan) sesi. session.delete (karyawan); tx.commit (); } catch (hibernateException e) {if (tx! = null) tx.rollback (); e.printstacktrace (); } akhirnya {session.close (); }}} Kompilasi dan jalankan:
Berikut adalah langkah -langkah untuk mengkompilasi dan menjalankan aplikasi di atas. Pastikan jalur dan classpath diatur dengan tepat sebelum menyusun dan mengeksekusi.
Dapatkan hasil berikut di layar dan catatan dibuat baik dalam tabel karyawan dan alamat.
$ java manajemen
..... berbagai pesan log akan ditampilkan di sini ......... Nama Depan: Manoj Nama Belakang: Kumar Gaji: 4000Address Street: Kondapur Kota: Hyderabad Negara Bagian: AP Zipcode: 532 Nama Pertama: Dilip Nama Belakang: KUMAR Gaji: 5000 Address Jalan: Kondapur Kota: Hyderabad Negara: Ap Zipcode: 5.000 Jalan: Kondapur: Hyderabad State: Ap Zipcode: 5.000 Jalan: Kondapur: Hyderabad State: Ap Zipcode: 5.000 Street: Kondapur City: Hyderabad State: AP Zipcode: 532
Jika Anda memeriksa tabel karyawan dan alamat, Anda harus merekamnya:
mysql> pilih * dari karyawan;
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
mysql> pilih * dari alamat;
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Pemetaan satu-ke-banyak
Pemetaan satu-ke-banyak dapat diimplementasikan menggunakan satu set koleksi Java yang tidak mengandung elemen duplikat. Kami telah melihat cara mengatur peta di Hibernate, jadi jika Anda telah belajar tentang pemetaan set, maka semua pengaturan dapat digunakan untuk pemetaan satu-ke-banyak.
Set dipetakan ke elemen <Set> dalam tabel peta dan diinisialisasi dalam java.util.hashset. Anda dapat menggunakan set koleksi di kelas, dengan elemen dalam koleksi yang tidak memerlukan duplikasi.
Kami masih menggunakan tabel RDBMS dan kelas POJO yang ditentukan dalam contoh di atas.
Tentukan file pemetaan hibernate:
Mari kita perintahkan hibernate cara mendefinisikan kelas yang dipetakan ke file pemetaan tabel basis data.
<? XML Versi = "1.0" encoding = "utf-8"?> <! Doctype hibernate-mapping public "-// hibernate/hibernate pemetaan dtd // en" "http://www.hibernate.org/dtd/hibernate-papping-3.0 <meta attribute = "class-description"> Kelas ini berisi detail karyawan. </meta> <id name = "id" type = "int" column = "id"> <generator/> </d> <set name = "sertifikat" cascade = "all"> <key column = "employee_id"/> <one-to-ymer name = "a name =" firstname "columne" first_name "firstName =" "a name =" firstName "columne =" first_name "" "" "" "" "name =" firstname "columne =" first_name "firste" fireme = "colum =" "a name =" firstName "COLMOLM =" First_Name "" "" "" "" "" "" name = "firstName" column "first_name first_name" firstName = "" FIRECE = "" FIRETNAME " type = "string"/> <properti name = "gaji" kolom = "gaji" type = "int"/> </slass> <class name = "sertifikat" Table = "sertifikat"> <meta atribut = "class-description"> Kelas ini berisi catatan sertifikat. </meta> <id name = "id" type = "int" column = "id"> <generator/> </d> <properti name = "name" column = "Certificate_name" type = "string"/> </class> </hibernate-mapping>
Format <ClassName> .hbm.xml dalam file pemetaan yang harus disimpan. Kami menyimpan file karyawan.hbm.xml di file pemetaan. Anda sudah terbiasa dengan sebagian besar detail pemetaan, tetapi mari kita lihat semua elemen dalam file pemetaan lagi:
Dokumen yang dipetakan adalah dokumen XML dengan <hibernate-Mapping> sebagai elemen root yang sesuai dengan setiap kelas yang berisi 2 elemen <slass>.
Elemen <slass> digunakan untuk menentukan pemetaan spesifik tabel basis data dari kelas Java. Nama Kelas Java Menentukan atribut nama elemen kelas dan Table Attribute Database Table Name ditentukan.
Elemen <meta> adalah elemen opsional yang dapat digunakan untuk membuat deskripsi kelas.
Elemen <d> memetakan atribut ID unik di kelas ke kunci utama tabel database. Atribut nama elemen ID mengacu pada kelas atribut dan atribut kolom mengacu pada kolom dalam tabel database. Atribut Type menyimpan tipe pemetaan hibernate, yang akan dikonversi dari Java ke tipe data SQL.
Elemen <Genator> dalam elemen ID digunakan untuk secara otomatis menghasilkan nilai kunci utama. Atur atribut kelas dari elemen yang dihasilkan untuk secara alami membiarkan hibernasi mengambil identitas, urutan atau algoritma Hilo untuk membuat kunci primer sesuai dengan kemampuan dukungan dari database yang mendasarinya.
Elemen <property> digunakan untuk memetakan properti kelas Java ke kolom dalam tabel database. Atribut nama elemen mengacu pada kelas atribut dan atribut kolom mengacu pada kolom dalam tabel database. Atribut Type menyimpan tipe pemetaan hibernate, yang akan dikonversi dari Java ke tipe data SQL.
Elemen <Set> menetapkan hubungan antara sertifikat dan kelas karyawan. Kami menggunakan elemen <Set> dalam atribut Cascade untuk memberi tahu Hibernate untuk menyimpan objek sertifikat dan juga menjadi objek karyawan. Atribut nama diatur ke set variabel yang ditentukan dalam kelas induk, dalam contoh kami adalah sertifikat. Untuk setiap set variabel, kita perlu menentukan satu set elemen terpisah dalam file pemetaan.
Elemen <yyy> adalah objek induk yang berisi kunci asing, yaitu kolom dalam tabel sertifikat. Karyawan meja.
Elemen <-satu-ke-banyak> menunjukkan bahwa objek karyawan melibatkan banyak sertifikat.
Buat kelas aplikasi:
Akhirnya, kami akan membuat metode utama () dari kelas aplikasi untuk menjalankan aplikasi. Kami akan menggunakan aplikasi ini untuk menyimpan beberapa karyawan bersama dengan sertifikat catatan, dan kemudian kami akan menerapkan catatan operasi CRUD.
impor java.util.*; impor org.hibernate.hibernateException; impor org.hibernate.Session; Impor org.hibernate.transaction; impor org.hibernate.SessionFactory; impor org.hibernate.cfg.configuration; Public Class ManagementAmployee {Private Static Session Factory; public static void main (string [] args) {try {factory = new configuration (). configure (). buildSessionFactory (); } catch (Throwable ex) {System.err.println ("Gagal membuat objek SesionFactory." + Ex); Lempar pengecualian baruinitializerError (EX); } Manajemen Me = Manajemen baru (); / * Mari kita memiliki serangkaian sertifikat untuk karyawan pertama */ hashset set1 = hashset baru (); set1.add (sertifikat baru ("MCA")); set1.add (sertifikat baru ("MBA")); set1.add (sertifikat baru ("MBA")); set1.add (sertifikat baru ("PMP")); / * Tambahkan catatan karyawan dalam database */ integer empid1 = me.addemployee ("manoj", "kumar", 4000, set1); / * Set sertifikat lain untuk karyawan kedua */ hashset set2 = hashset baru (); set2.add (sertifikat baru ("BCA")); set2.add (sertifikat baru ("BA")); / * Tambahkan catatan karyawan lain dalam database */ integer empid2 = me.addemployee ("dilip", "kumar", 3000, set2); / * Daftar semua karyawan */ me.listemployee (); / * Perbarui catatan gaji karyawan */ me.updateemployee (empid1, 5000); / * Hapus seorang karyawan dari database */ me.deleTeeMarder (empid2); / * Daftar semua karyawan */ me.listemployee (); } / * Metode untuk menambahkan catatan karyawan dalam database * / addemployee integer publik (string fname, string lname, int gaji, setel sertifikat) {session session = factory.opensession (); Transaksi tx = null; Integer Pegawai = NULL; coba {tx = session.begintransaction (); Karyawan Karyawan = Karyawan Baru (nama, lname, gaji); karyawan.setCertificates (cert); karyawan = (integer) session.save (karyawan); tx.commit (); } catch (hibernateException e) {if (tx! = null) tx.rollback (); e.printstacktrace (); } akhirnya {session.close (); } mengembalikan karyawan; } / * Metode untuk mencantumkan semua detail karyawan * / public void listeMiryees () {session session = factory.opensession (); Transaksi tx = null; coba {tx = session.begintransaction (); Daftar karyawan = session.createqueery ("dari karyawan"). Daftar (); untuk (iterator iterator1 = karyawan.iterator (); iterator1.hasnext ();) {karyawan karyawan = (karyawan) iterator1.next (); System.out.print ("Nama Depan:" + karyawan.getFirstName ()); System.out.print ("Nama Belakang:" + karyawan.getLastName ()); System.out.println ("Gaji:" + karyawan.getSalary ()); Setel sertifikat = usaha.getCertificates (); untuk (iterator iterator2 = sertifikat.iterator (); iterator2.hasnext ();) {sertifikat sertifikat = (sertifikat) iterator2.next (); System.out.println ("Sertifikat:" + certname.getName ()); }} tx.Commit (); } catch (hibernateException e) {if (tx! = null) tx.rollback (); e.printstacktrace (); } akhirnya {session.close (); }} / * Metode untuk memperbarui gaji untuk karyawan * / public void updateMireee (integer employeeid, int gaji) {session session = factory.opensession (); Transaksi tx = null; coba {tx = session.begintransaction (); Pegawai Karyawan = (karyawan) sesi. karyawan.setsalary (gaji); session.update (karyawan); tx.commit (); } catch (hibernateException e) {if (tx! = null) tx.rollback (); e.printstacktrace (); } akhirnya {session.close (); }} / * Metode untuk menghapus karyawan dari catatan * / public void deleteEmployee (integer usaha) {session session = factory.opensession (); Transaksi tx = null; coba {tx = session.begintransaction (); Pegawai Karyawan = (karyawan) sesi. session.delete (karyawan); tx.commit (); } catch (hibernateException e) {if (tx! = null) tx.rollback (); e.printstacktrace (); } akhirnya {session.close (); }}} Kompilasi dan jalankan:
$ java manajemen
.....VARIOUS LOG MESSAGES WILL DISPLAY HERE.........First Name: Manoj Last Name: Kumar Salary: 4000Certificate: MBACertificate: PMPCertificate: MCAFirst Name: Dilip Last Name: Kumar Salary: 3000Certificate: BCACertificate: BAFirst Name: Manoj Last Name: Kumar Salary: 5000Certificate: MBACertificate: PMPCertificate: MCA
Jika Anda memeriksa formulir karyawan dan sertifikat, Anda harus merekamnya:
mysql> pilih * dari karyawan;
+----------------------------+----------+| ID | first_name | last_name | Gaji |+------------------------------------+------------+----------+| 1 | Manoj | Kumar | 5000 |+--------------------------------+---------+1 baris di set (0,00 detik)
mysql> pilih * dari sertifikat;
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------