Hibernate telah melakukan klasifikasi dan integrasi dan menemukan bahwa Hibernate sebenarnya dibagi menjadi tiga bagian: objek inti, pemetaan, dan HQL. Ketiga bagian ini paling umum digunakan dalam proses pengembangan. Artikel sebelumnya membahas metode konversi antara objek inti dan objek. Selanjutnya, diskusikan metode penggunaan pemetaan Hibernate.
Fungsi penting hibernate adalah pemetaan, yang dapat mengonversi antara model objek dan model relasional. Ini dianjurkan oleh ide pemrograman yang berorientasi objek. Pengembang yang menggunakan program pemetaan hanya perlu peduli dengan penulisan kode dalam model objek. Pemetaan antara suatu objek dan database relasional biasanya ditentukan oleh dokumen XML. Dokumen pemetaan ini dirancang agar dapat dibaca dan dapat dimodifikasi secara manual. Saya merangkum hubungan pemetaan ini seperti yang ditunjukkan pada gambar berikut:
Pemetaan didefinisikan melalui XML, dikelola menggunakan sesi yang dibuat oleh Hibernate, dan akhirnya sesi menggunakan JTA untuk mengirimkan perubahan ke database. Sesi ini dapat dipahami sebagai manajer kegigihan, yang mengelola objek di lapisan kegigihan. Ini dibuat oleh sessionFactory. Saat pemrograman dengan Hibernate, Anda harus terlebih dahulu terhubung ke database, jadi Anda harus terlebih dahulu memeriksa konfigurasi koneksi basis data di XML, buat sessionFactory sesuai dengan konfigurasi dokumen (yang dapat dipahami sebagai cermin basis data), dan kemudian membuat sessionFactory. Akhirnya, sesi akan mengirimkan perubahan ke database secara seragam, yang akan menyelesaikan semua operasi.
Proses penggunaan
1. Buat file pemetaan, dan file pemetaan sufiks dengan .hbm.xml, menunjukkan bahwa itu adalah file pemetaan hibernasi;
2. Daftarkan kelas entitas dalam file pemetaan dan tambahkan properti kelas entitas ke kelas pemetaan. Saat menambahkan properti, Anda harus menentukan dua nilai: ID dan properti. ID menunjukkan bahwa itu adalah satu -satunya pengidentifikasi entitas, dan properti menunjukkan bahwa itu adalah kolom bidang tabel;
3. Kirim modifikasi dan menyinkronkan data.
Catatan: Pengembang yang telah mengembangkan data XML ke database akan segera memahami bahwa pemetaan ini sebenarnya merupakan proses pembaruan batch dan pembuatan batch, dan pemetaan tidak terkecuali. Hibernate menetapkan satu set standar pemetaan yang dapat dikonversi sesuai dengan standar. Implementasinya masih mati, sehingga hanya relatif fleksibel dan mudah digunakan.
Proses Pemetaan Kelas Entitas Sederhana:
1. Kode properti kelas entitas pengguna1:
paket com.hibernate; impor java.util.date; Public Class User1 {Private String ID; nama string pribadi; kata sandi string pribadi; createTime tanggal pribadi; Tanggal Privat Kedaluwarsa; string publik getId () {return id; } public string getName () {return name; } public void setName (name string) {this.name = name; } public string getPassword () {return kata sandi; } public void setPassword (kata sandi string) {this.password = kata sandi; } tanggal publik getCreateTime () {return createTime; } public void setCreateTime (date createTime) {this.createTime = createTime; } Tanggal publik getExpiretime () {return expiretime; } public void setExpiretime (tanggal kedaluwarsa) {this.expiretime = extreTime; }}
2. Implementasi kode internal USER1.HBM.XML dari file pemetaan user1.java:
Pengaturan yang dapat diatur dalam basis data dasar juga disediakan dalam Hibernate. Anda dapat menggunakan atribut label untuk mengatur hubungan pemetaan tertentu.
Kelas-> Tabel Gunakan tag kelas, properti yang umum digunakan:
(1) Nama: Kelas Entitas Peta, nilainya perlu diatur ke nama kelas entitas yang perlu dikonversi menjadi tabel. Selama sinkronisasi, kelas entitas yang sesuai akan ditemukan berdasarkan atribut ini.
(2) Tabel: Peta nama tabel database. Jika nama tabel yang akan dipetakan berbeda dari nama kelas entitas, gunakan properti ini untuk menentukan tabel yang dipetakan. Jika tidak ada, tabel akan dibuat berdasarkan nilai properti.
Periksa struktur tabel yang dihasilkan oleh konfigurasi pada gambar di atas, seperti yang ditunjukkan di bawah ini:
Nama tabel diubah menjadi T_USER1; Bidang ID diubah menjadi user_id, dan panjang bidang adalah 32 bit; Properti CreateTime dipetakan ke bidang database Create_Time, dan dimodifikasi untuk jenis tanggal.
Properti -> Bidang menggunakan ID atau tag properti, properti yang biasa digunakan:
(1) Nama: Fungsi ini mirip dengan nama tag kelas, dan nilainya menentukan nama atribut pemetaan dari kelas entitas;
(2) Kolom: Mirip dengan tabel tag kelas entitas, menentukan nama kolom tabel pemetaan, dan akan dibuat jika tidak ada;
(3) Ketik: Tentukan tipe data yang dipetakan ke bidang dalam database dan lihat dokumen sesuai kebutuhan;
(4) Generator, yang opsional, digunakan untuk menghasilkan pengidentifikasi unik untuk kelas persisten.
<id name = "id" type = "long" column = "cat_id"> <generator> <param name = "Table"> uid_table </param> <param name = "column"> next_hi_value_column </param> </generator> </d>
Semua generator mengimplementasikan antarmuka org.hibernate.id.Identifiergenerator. Ini adalah antarmuka yang sangat sederhana; Beberapa aplikasi dapat memilih untuk memberikan implementasi spesifik mereka sendiri. Tentu saja, Hibernate menyediakan banyak implementasi bawaan. Berikut adalah beberapa jenis yang umum digunakan:
(1) Identitas: Pengidentifikasi yang dikembalikan adalah tipe panjang, pendek atau int. Mirip dengan bidang pendapatan diri basis data.
(2) Urutan: Gunakan urutan dalam DB2, PostgreSQL, Oracle, SAP DB, McKOI, dan Generator dalam Interbase. Pengidentifikasi yang dikembalikan adalah tipe panjang, pendek, atau int. Di seluruh database, alih-alih meningkat sendiri dalam satu tabel, Anda perlu menentukan bahwa peningkatan diri dalam satu tabel perlu ditambahkan.
(3) UUID: Gunakan algoritma UUID 128-bit untuk menghasilkan pengidentifikasi tipe string, yang unik dalam jaringan (menggunakan alamat IP). UUID dikodekan sebagai string angka heksadesimal 32-bit. Mirip dengan nomor seri yang dihasilkan oleh .net.
(4) Asli: Pilih salah satu identitas, urutan atau hilo berdasarkan kemampuan database yang mendasarinya. Dengan cara yang fleksibel, jenis identitas yang digunakan akan ditentukan berdasarkan database yang digunakan. MySQL akan memilih Identity dan Oracle akan memilih urutan.
(5) Ditugaskan: Buat ID identifikasi secara manual untuk kelas entitas. Ini adalah kebijakan pembuatan default ketika elemen <Genator> tidak ditentukan.
(6) Asing: Gunakan pengidentifikasi objek terkait lainnya. Biasanya digunakan dalam kombinasi dengan <sat satu ke satu>.
Pengembang sering digunakan untuk metode konfigurasi manual untuk menulis properti konfigurasi sesuai dengan instruksi dokumentasi. Ini sangat primitif. Pemula merekomendasikan penggunaan metode konfigurasi manual untuk membantu berpikir. Ada juga banyak alat pihak ketiga yang menggunakan metode visual untuk mengonfigurasi dan menghasilkan dokumen konfigurasi XML, yang meningkatkan efisiensi pengembangan. Alat serupa seperti XDOCLET, MIDDGEN dan ANDORMDA.
Pemetaan asosiatif banyak lawan satu
Pemetaan dasar hibernate dibahas di atas. Kelas entitas sesuai dengan tabel dan menggunakan pemetaan tag <class> dalam file pemetaan hibernate yang sesuai. Dan properti normal di kelas entitas sesuai dengan bidang tabel dan dipetakan menggunakan tag <propt>. Selain itu, ketika membangun kelas entitas, Anda harus memperhatikan: konstruktor default tanpa parameter harus diimplementasikan di kelas entitas, dan label harus disediakan. Disarankan untuk tidak menggunakan final untuk memodifikasi kelas entitas dan menghasilkan metode Getter dan Setter untuk kelas entitas. Akhirnya, beberapa strategi generasi utama utama diperkenalkan, dan langkah selanjutnya adalah membahas pemetaan banyak-ke-satu.
Pemetaan korelasi banyak-ke-satu ini tercermin dalam model objek. Ini adalah hubungan agregasi. Pengguna adalah bagian dari grup. Ada pengguna di grup. Siklus hidup mereka berbeda dan dapat tercermin dalam gambar berikut:
Jadi bagaimana pemetaan hubungan banyak-ke-satu ini diatur dalam Hibernate? Berikut ini akan memperkenalkan dua metode: Gunakan tag <nother-to-one> untuk memetakan secara langsung, atau gunakan kaskade <nother-to-one> untuk memodifikasi tabel.
1. Pemetaan langsung banyak-ke-satu <br /> dapat dipahami dari makna literal yang mengacu pada hubungan banyak-ke-satu. Banyak yang mengacu pada akhir yang lebih banyak, dan satu mengacu pada akhir yang lebih sedikit. Saat menggunakannya, tag ini sering digunakan dalam HBM dari ujung yang lebih banyak, dan atribut nama <banyak-ke-satu> diatur ke atribut satu ujung satu di kelas yang sesuai dari file pemetaan, seperti: <banyak-ke-satu nama = "grup" kolom = "groupId"> </banyak-ke-satu>. Tag ini ditambahkan ke user.hbm.xml, yang sesuai dengan banyak; Nilai nama dalam tag adalah grup untuk memetakan satu, dan akan ada atribut yang disebut grup di user.java. Selanjutnya, mari kita lihat kelas kode spesifik yang mengimplementasikan implementasi.
(1) Kode kelas user.java, yang memiliki properti yang disebut grup, yang akan digunakan sebagai nilai nama dari salah satu ujung <-banyak-ke-satu>.
pengguna kelas publik {nama string privat; public string getName () {return name; } public void setName (name string) {this.name = name; } grup grup pribadi; grup publik getGroup () {return group; } public void setGroup (grup grup) {this.group = grup; }}(2) Nilai nama <nother-to-one> di user.hbm.xml adalah nilai properti dari satu sisi di user.java. Ini akan menghasilkan kolom baru dalam database, yang dapat dipahami sebagai kunci asing dari tabel pengguna.
<? 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-Mapping> <class name = "com.hibernate.user" table = "user"> <id name = "id" type = "java.lang.long"> <name kolom = "id" /> <generator /> </d> <!-Nilai nama adalah properti di yang sesuai di user.java. Ini akan secara otomatis menghasilkan kolom dalam tabel, sehingga kolom diganti namanya menggunakan kolom-> <banyak-ke-satu nama = "grup" kolom = "groupId"> </banyak-ke-satu> </slass> </hibernate-mapping>
(3) Uji hubungan pemetaan di atas, tulis dua objek pengguna ke dalam tabel, beri nama User1 dan User2, beri nama Zhang San dan Li Si, gunakan sesi untuk menyimpan objek, tulis data ke database, kodenya adalah sebagai berikut:
public void testSave1 () {session session = null; coba {session = getSession.getSession (); session.begintransaction (); Grup grup = grup baru (); group.setname ("node power"); Pengguna pengguna1 = pengguna baru (); user1.setname ("Zhang San"); user1.setgroup (grup); Pengguna pengguna2 = pengguna baru (); user2.setname ("li si"); user2.setgroup (grup); session.save (user1); session.save (user2); // Kesalahan TransientObjectException akan dilaporkan // Kesalahan terjadi ketika membersihkan cache transientObjectException // karena grup adalah keadaan sementara, tidak ada sesi, dan tidak ada data pencocokan dalam database // saat ada di negara bagian yang terus -menerus tidak dapat menemukan objek dalam cache // yang diungkapkan pada cache // objek yang terus -menerus di negara -negara yang terus -menerus di Cache. session.getTransaction (). Commit (); } catch (Exception e) {E.PrintStackTrace (); session.getTransaction (). rollback (); } akhirnya {getSession.closesession (sesi); }}Namun, saat menggunakan kode di atas, transientObjectException akan dilaporkan saat mengeksekusi menulis. Ini karena ketika menyimpan objek pengguna, ia akan mencari objek grup dalam memori sesuai dengan grup yang ditambahkan dalam <banyak-ke-satu>. Namun, dalam kode di atas, objek grup selalu berada dalam keadaan sementara dan tidak dikelola oleh sesi, yang berarti bahwa objek sesi tidak dapat ditemukan, dan objek pengguna memasuki keadaan persisten, sehingga kesalahan ini akan dilaporkan. Kode yang benar adalah sebagai berikut:
public void testSave2 () {session session = null; coba {session = getSession.getSession (); session.begintransaction (); Grup grup = grup baru (); group.setname ("node power"); session.save (grup); // Atur objek grup di sini ke pengguna objek persisten pengguna1 = pengguna baru (); user1.setname ("Zhang San"); user1.setgroup (grup); Pengguna pengguna2 = pengguna baru (); user2.setname ("li si"); user2.setgroup (grup); session.save (user1); session.save (user2); // Data dapat disimpan dengan benar // karena grup dan pengguna adalah objek dalam keadaan persisten // objek terkait dapat ditemukan dalam sesi ketika hibernate membersihkan cache sesion.gettransaction (). Commit (); } catch (Exception e) {E.PrintStackTrace (); session.getTransaction (). rollback (); } akhirnya {getSession.closesession (sesi); }} 2. Pemetaan Cascading
Selain mengonversi objek grup dan objek pengguna ke objek persisten yang disebutkan di atas, Anda juga dapat menggunakan atribut pemetaan kaskade kaskade, tambahkan atribut kaskade dalam atribut <nother-to-one>, dan salin untuk menghemat pembaruan. Anda dapat menulis ke database ketika objek grup tidak dalam keadaan persisten. Dengan cara ini, Anda hanya perlu mengatur atribut grup dari dua objek pengguna ke objek grup yang sama untuk mencapai hubungan pemetaan banyak-ke-satu. Pada saat ini, konten yang sesuai di user.hbm.xml adalah kode 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-Mapping> <class name = "com.hibernate.user" Table = "user"> <id name = "id" type = "java.lang.long"> <kolom name = "id"/> <generator/> </d> <!-tabel modifikasi cascade = "save-to-outon" name = "group" cascade " </hibernate-Mapping>
Catatan: Setelah Cascade diatur untuk menghemat pembaruan, itu dapat berupa modifikasi, penambahan dan penghapusan ke database, tetapi operasi kueri kaskade spesifik tidak dapat dilakukan.
Metode file konfigurasi tes yang sesuai adalah sebagai berikut:
// cascade cascade public void testSave3 () {session session = null; coba {session = getSession.getSession (); session.begintransaction (); Grup grup = grup baru (); group.setname ("node power"); Pengguna pengguna1 = pengguna baru (); user1.setname ("Zhang San"); user1.setgroup (grup); Pengguna pengguna2 = pengguna baru (); user2.setname ("li si"); user2.setgroup (grup); session.save (user1); session.save (user2); // TransientObjectException tidak dilemparkan // karena kaskade digunakan // Hibernate pertama -tama akan menyimpan grup objek terkait pengguna // grup dan pengguna keduanya objek dalam status persisten sesi .getTransaction (). Commit (); } catch (Exception e) {E.PrintStackTrace (); session.getTransaction (). rollback (); } akhirnya {getSession.closesession (sesi); }} 3. Sublimasi komparatif
Kedua metode ini juga menerapkan metode pemetaan banyak-ke-satu, dan hasilnya sama, tetapi mereka sangat berbeda dalam implementasi. Apakah tipe pertama atau kedua menggunakan <nany-to-one> untuk menambahkan tag ke file pemetaan di banyak ujung, dan menetapkan atribut nama tag ke nilai atribut dari salah satu ujung kelas yang terdaftar oleh file pemetaan, sehingga menyelesaikan pemetaan dasar banyak-ke-satu, yang sama. Perbedaannya adalah bahwa hubungan pemetaan langsung tidak menggunakan atribut bidang hibernate, yang lebih fleksibel dalam implementasi. Ini tidak hanya mendukung penambahan, penghapusan dan modifikasi, tetapi juga memungkinkan kueri; Modifikasi kaskade kaskade kedua mengadopsi metode yang disediakan oleh Hibernate. Metode ini hanya mendukung penambahan, penghapusan dan modifikasi, dan tidak mendukung permintaan.