Pemetaan peta
Peta Peta adalah koleksi Java yang menyimpan elemen-elemen dalam pasangan nilai kunci dan tidak mengizinkan elemen duplikat dalam daftar. Antarmuka peta menyediakan tiga tampilan koleksi, memungkinkan konten peta dianggap sebagai satu set koleksi nilai kunci, atau mengatur hubungan pemetaan nilai kunci.
Peta dipetakan ke elemen <peta> di tabel pemetaan dan peta yang tidak tertib dapat diinisialisasi dalam java.util.hashmap.
Tentukan tabel RDBMS:
Pertimbangkan situasi di mana kita membutuhkan catatan karyawan untuk disimpan dalam tabel karyawan, yang akan memiliki struktur berikut:
Buat tabel karyawan (id int not null auto_increment, first_name varchar (20) default null, last_name varchar (20) default null, gaji int default null, kunci utama (id));
Selain itu, diasumsikan bahwa setiap karyawan dapat memiliki satu atau lebih sertifikat yang terkait dengannya. Kami menyimpan informasi yang relevan dari sertifikat dalam tabel terpisah dengan struktur berikut:
Buat sertifikat tabel (id int not null auto_increment, sertifikat_type varchar (40) default null, sertifikat_name varchar (30) null default, empleme_id int default null, kunci utama (id));
Ada hubungan satu-ke-banyak antara karyawan dan objek sertifikat.
Tentukan Kelas Pojo:
Mari kita terapkan karyawan kelas POJO yang akan digunakan untuk memegang koleksi objek di tabel karyawan dan variabel daftar dengan sertifikat.
impor java.util.*; karyawan kelas publik {private int id; Private String FirstName; Private String LastName; gaji int pribadi; sertifikat peta pribadi; pegawai publik () {} pegawai publik (string fname, string lname, int gaji) {this.firstname = fname; this.lastname = lname; this.salary = gaji; } 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; } peta publik getCertificates () {sertifikat pengembalian; } setCertificates public void (sertifikat peta) {this.certificates = sertifikat; }}Kami membutuhkan tabel sertifikat yang sesuai untuk menentukan kelas POJO lain, objek sertifikat seperti itu dapat menyimpan dan mengambil tabel sertifikat.
sertifikat kelas publik {private int id; nama string pribadi; sertifikat publik () {} sertifikat publik (nama string) {this.name = name; } public 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; }} Tentukan file pemetaan hibernate:
Mari kita kembangkan file pemetaan yang menginstruksikan Hibernate cara mendefinisikan kelas yang dipetakan ke tabel database. Elemen <peta> akan digunakan untuk menentukan aturan untuk peta yang digunakan.
<? 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> <peta name = "sertifikat" cascade = "all"> <key column = "emplingee_id"/> <index column = "certificate_type" type = "string"/> <satu-ke-banyak/</peta name/"" "" "" "" "" "" "" "" "" "" "" "" "" "TYPE" FOLDE "FOLDE" FOLDE "FOLDE" TYPETE "TYPETE" TYPETE "TYPETE" FOLDE "FOLDE" FOLDE "FOLDE" TYPET " name = "LastName" kolom = "last_name" type = "string"/> <properti name = "gaji" kolom = "gaji" type = "int"/> </belas> <class name = "sertifikat" Tabel = "sertifikat"> <meta atribut = "kelas-deskripsi"> 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. 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 menjadi asli untuk membiarkan hibernate mengambil algoritma dalam 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.
Elemen <peta> digunakan untuk mengatur hubungan antara sertifikat dan kelas karyawan. Kami menggunakan elemen <pap> dari atribut Cascade untuk memberi tahu Hibernate untuk menyimpan objek sertifikat, dan juga ke objek karyawan. Atribut nama diatur untuk mendefinisikan mapVariable di kelas induk, dalam kasus kami sertifikat.
Elemen <index> digunakan untuk mewakili pasangan kunci/nilai kunci dan nilai. Kunci ini akan menggunakan tipe string yang disimpan dalam sertifikat_type kolom.
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 objek sertifikat, dan oleh karena itu, objek sertifikat harus terkait dengan kelas induk karyawan. Anda dapat menggunakan elemen-elemen <Enter-satu-satu>, <-banyak-ke-satu> atau <banyak-ke-banyak> sesuai kebutuhan.
Buat kelas aplikasi:
Akhirnya, buat metode utama () dari kelas aplikasi untuk menjalankan aplikasi. Gunakan aplikasi ini untuk menyimpan catatan karyawan bersama dengan daftar sertifikat, dan kemudian melakukan catatan pada operasi CRUD pada aplikasi.
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 */ hashmap set = hashmap baru (); set.put ("ComputersScience", sertifikat baru ("MCA")); set.put ("BusinessManagement", sertifikat baru ("MBA")); set.put ("ProjectManagement", sertifikat baru ("PMP")); / * Tambahkan catatan karyawan dalam database */ integer empid = me.addemployee ("manoj", "kumar", 4000, set); / * Daftar semua karyawan */ me.listemployee (); / * Perbarui Catatan Gaji Karyawan */ Me.UpdateMir Kerja (Empid, 5000); / * Daftar semua karyawan */ me.listemplees (); } / * Metode untuk menambahkan catatan karyawan dalam database * / addemployee integer publik (string fname, string lname, int gaji, sertifikat hashmap) {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 ()); Peta ec = usaha.getCertificates (); System.out.println ("Sertifikat:" + (((((sertifikat) ec.get ("ComputersScience")). GetName ())); System.out.println ("Certificate:" + (((Certificate) ec.get ("BusinessManagement")). GetName ()); System.out.printat ((((Sertifikat) ec.get ("ProjectManagement")). GetName ())); E.PrintStackTrace (); Karyawan); DeleteEmure (Integer Pegawai) {Sesi Sesi = Factory.opensession (); (tx! = null) tx.rollback (); Kompilasi dan jalankan:
Berikut adalah langkah -langkah untuk mengkompilasi dan menjalankan aplikasi di atas. Pastikan Anda telah mengatur jalur dan classpath dengan tepat sebelum menyusun dan mengeksekusi.
Hasil berikut akan diperoleh di layar dan catatan dibuat dalam formulir karyawan dan sertifikat.
$ java manajemen
..... berbagai pesan log akan ditampilkan di sini .........
Nama Depan: Manoj Nama Belakang: Kumar Gaji: 4000certificate: McAcertificate: Mbacertificate: PMPFirst Nama: Manoj Nama Belakang: Kumar Gaji: 5000Certificate: McAcertificate: MBacertificate: PMP
Jika Anda memeriksa formulir karyawan dan sertifikat, Anda harus merekamnya:
mysql> pilih * dari karyawan;
+-----------------------------+------------+| ID | first_name | last_name | Gaji |+--------------------------------------+---------------+| 60 | Manoj | Kumar | 5000 |+---------------------------------+---------+1 baris di set (0,00 detik)
mysql> pilih * dari sertifikat;
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Pemetaan SortedMap
SortedMap adalah elemen yang disimpan dalam pasangan nilai kunci dan memberikan jenis kunci keseluruhan yang mirip dengan koleksi java untuk pemetaan. Elemen duplikat tidak diizinkan dalam pemetaan. Peta diurutkan dalam urutan alami kuncinya, atau dengan memberikan perbandingan biasanya pada waktu penciptaan peta yang dipesan.
Elemen <peta> dan peta yang dipesan yang dipetakan oleh sortedmap dalam tabel pemetaan dapat diinisialisasi dalam java.util.treemap.
Kami masih menggunakan tabel RDBMS dan kelas POJO yang didefinisikan di atas untuk menggambarkan contoh berikut:
Tentukan file pemetaan hibernate:
Mari kita kembangkan file pemetaan yang menginstruksikan Hibernate cara mendefinisikan kelas yang dipetakan ke tabel database. Elemen <peta> akan digunakan untuk menentukan aturan untuk peta yang digunakan.
<? 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/> </id> <map name="certificates" cascade="all" sort="MyClass"> <key column="employee_id"/> <index column="certificate_type" type="string"/> <one-to-many/> </map> <property name="firstName" column="first_name" type = "string"/> <properti name = "lastName" column = "last_name" type = "string"/> <properti name = "gaji" kolom = "gaji" type = "int"/> </slass> <class name = "sertifikat" Table = "sertifikat"> <meta atribut = "class-description"> Class Catatan Catatan ini. </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 pemetaan karyawan.hbm.xml. Sudah terbiasa dengan sebagian besar detail pemetaan, tetapi mari kita lihat semua elemen dalam file pemetaan lagi:
Dokumen yang dipetakan adalah dokumen XML dengan elemen root dari <Hibibernate-Mapping> yang sesuai dengan setiap kelas yang berisi 2 elemen <Class>.
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 membuat hibernasi sesuai dengan algoritma dalam 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.
Elemen <peta> digunakan untuk mengatur hubungan antara sertifikat dan kelas karyawan. Kami menggunakan elemen <pap> dari atribut Cascade untuk memberi tahu Hibernate untuk menyimpan objek sertifikat, dan juga ke objek karyawan. Atribut nama diatur ke variabel sortedMap yang ditentukan dalam kelas induk, dalam kasus kami adalah sertifikat. Properti penyortiran dapat diatur ke penyortiran alami, atau dapat diatur ke implementasi kelas khusus sebagai java.util.c.c.parkorator. Kami telah menggunakan kelas myClass yang mengimplementasikannya sebagai java.util.
Elemen <index> digunakan untuk mewakili bagian kunci dari peta pasangan kunci/nilai. Kunci ini akan menggunakan tipe string yang disimpan dalam sertifikat_type kolom.
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 objek sertifikat, dan oleh karena itu, objek sertifikat harus dikaitkan dengan orang tua karyawan. Anda dapat menggunakan elemen-elemen <Enter-satu-satu>, <-banyak-ke-satu> atau <banyak-ke-banyak> sesuai kebutuhan.
Jika Anda menggunakan sort = "alami", maka kami tidak perlu membuat kelas terpisah, karena kelas sertifikat telah menerapkan antarmuka yang sebanding dan hibernate akan menggunakan compareto di kelas sertifikat yang didefinisikan sebagai metode sortedmap (). Namun, kami menggunakan kelas pembanding kustom MyClass di file pemetaan kami, jadi kami harus membuat kelas ini berdasarkan algoritma penyortiran kami. Mari kita lakukan penyortiran kunci yang tersedia di peta.
Impor java.util.comParkaror; kelas publik MyClass mengimplementasikan pembanding <string> {public int perbandingan (String O1, String O2) {final int sebelum = -1; int final setelah = 1; / * Untuk membalikkan urutan penyortiran, beberapa dengan -1 */ if (o2 == null) {return sebelum * -1; } Sebanding inicertificate = o1; Sebanding yang bersertifikat = o2; if (inicertificate == null) {return setelah * 1; } else if (thatcertificate == null) {return sebelum * -1; } else {return thiscertificate.compareto (thatcertificate) * -1; }}}Akhirnya, kami akan membuat metode utama () dari kelas aplikasi untuk menjalankan aplikasi. Kami akan menggunakan aplikasi ini untuk menyimpan beberapa catatan karyawan bersama dengan sertifikat, dan kemudian kami akan mengirimkan operasi CRUD di atas 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 serangkaian sertifikat untuk karyawan pertama */ treemap set1 = treemap baru (); set1.put ("ComputersScience", sertifikat baru ("MCA")); set1.put ("BusinessManagement", sertifikat baru ("MBA")); set1.put ("ProjectManagement", sertifikat baru ("PMP")); / * Tambahkan catatan karyawan dalam database */ integer empid1 = me.addemployee ("manoj", "kumar", 4000, set1); / * Set sertifikat lain untuk karyawan kedua */ treemap set2 = new treemap (); set2.put ("ComputersScience", sertifikat baru ("MCA")); set2.put ("Management Business", sertifikat baru ("MBA")); / * 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.listemplees (); } / * Metode untuk menambahkan catatan karyawan dalam database * / addemployee integer publik (string fname, string lname, int gaji, sertifikat treemap) {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 ()); Sortedmap <string, sertifikat> peta = usaha.getCertificates (); untuk (map.entry <string, sertifikat> entri: map.entryset ()) {system.out.print ("/tcertificate type:" + entry.getKey ()); System.out.println (", Name:" + (Entry.getValue ()). 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 (); Karyawan karyawan = (karyawan) sesi.get (karyawan.class, karyawan); 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:
Anda dapat melihat bahwa sertifikat telah diurutkan dalam urutan yang berlawanan. Anda dapat mencobanya dengan mengubah file pemetaan, cukup atur sort = "natural" dan jalankan program, dan bandingkan hasilnya.
$ java manajemen
.....VARIOUS LOG MESSAGES WILL DISPLAY HERE.........First Name: Manoj Last Name: Kumar Salary: 4000 Certificate Type: ProjectManagement, Name: PMP Certificate Type: ComputerScience, Name: MCA Certificate Type: BusinessManagement, Name: MBAFirst Name: Dilip Last Name: Kumar Salary: 3000 Certificate Type: ComputerScience, Name: MCA Certificate Type: BusinessManagement, Name: MBAFirst Name: MANOJ Nama Belakang: Kumar Gaji: 5000 Jenis Sertifikat: Manajemen Proyek, Nama: PMP Jenis Sertifikat: Computerscience, Nama: Jenis Sertifikat MCA: Manajemen Bisnis, Nama: MBA
Jika Anda memeriksa formulir karyawan dan sertifikat, Anda harus merekamnya:
mysql> pilih * dari karyawan;
+----+--------------------+---------+| ID | first_name | last_name | Gaji |+------------------------------------+-------------+------------+| 74 | Manoj | Kumar | 5000 |+--------------------------------+---------+1 baris di set (0,00 detik)
mysql> pilih * dari sertifikat;
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------