File basis data awal yang diperlukan dalam artikel ini, kode sampel lengkap untuk operasi hibernate umum (termasuk semua file jar yang diperlukan untuk operasi hibernate) disediakan untuk diunduh dan pembelajaran: http://download.csdn.net/detail/daijin888888/9551724
1. Pemetaan Asosiasi Hibernate
1) Apa itu pemetaan asosiasi?
Jika ada hubungan antara tabel, Hibernate memungkinkan kita untuk menggambarkan hubungan mereka di HBM.XML, dan kemudian secara otomatis beroperasi pada tabel hubungan lain sesuai dengan hubungan ini ketika kita mengoperasikan salah satu tabel. Kemudian, pengaturan hubungan asosiasi ini disebut pemetaan asosiasi.
2) Apa manfaat pemetaan asosiasi?
Beberapa tabel dapat dikaitkan dengan satu kunjungan
--LOKUH DATA DATA HUBUNGAN TABEL ASOSIATION
--Sociate data baru dan dimodifikasi dari tabel hubungan
-Data Hapus yang Berlaku dari Tabel Hubungan
3) Langkah Implementasi Pemetaan Asosiasi
- Memahami hubungan antara tabel dan mengklarifikasi bidang hubungan
-Lepaskan atribut asosiasi di kelas entitas untuk merangkum data yang terkait
-Anda perlu mengonfigurasi file hbm.xml dan mengatur hubungan asosiasi
*2. Asosiasi satu-ke-banyak
Contoh: Jika suatu akun memiliki beberapa catatan layanan, diharapkan bahwa ketika menanyakan data akun, itu akan secara otomatis meminta data layanan yang sesuai.
1) Hubungan tabel
Hubungan satu-ke-banyak, bidang hubungan adalah service.account_id. (Artinya, harus ada bidang akun_id yang terkait dengan tabel akun dalam tabel layanan, dan bidang ini sesuai dengan ID dalam tabel akun)
2) Tambahkan atribut hubungan
Di kelas akun, tambahkan Layanan Atribut Terkait, yang merupakan Type Set <sver Service>.
set pribadi <servate> services = hashset baru <service> ();
3) Mengatur hubungan
--tata bahasa
Tetapkan hubungan satu-ke-banyak di akun.hbm.xml
<set name = "nama atribut asosiasi"> <Key column = "nama bidang asosiasi"/> <satu-ke-banyak/> </set> --Implement <set name = "services"> <Key column = "Account_id"/> <satu-ke-banyak/> </set>
4) Kode Sampel
Diketahui:
-Layanan Atribut yang Berlaku
-Account_id Fieldsasatiated
-Layanan Objek Asosiasi-> Layanan Nama Tabel
<span style = "font-size: 14px;"> public void testFind () {session session = hibernateutil.getSession (); Akun a = (akun) session.load (akun.class, 1010); System.out.println ("--- Tampilkan Informasi Akun Akun ----"); System.out.println (a.getId () + "" + a.getRealName () + "" + a.getIdcardno ()); System.out.println ("-Tunjukkan akun bisnis di bawah akun saat ini ----"); Set <servate> services = a.getServices (); untuk (layanan s: services) {System.out.println (s.getId () + "" + s.getosuserName () + "" + s.getunixhost ()); } System.out.println (a.toString ()); } </span>*3. Asosiasi banyak-ke-satu
Contoh: Saya berharap bahwa setelah meminta data layanan, saya dapat secara otomatis meminta data akun yang sesuai.
1) Hubungan
Layanan dan Akun memiliki hubungan banyak-ke-satu, dan bidang hubungan adalah layanan.account_id
2) Tambahkan atribut terkait
-Lepaskan Akun Properti Terkait di Kelas Entitas Layanan, jenisnya adalah akun.
Akun Pribadi Akun;
Setelah itu, atribut AccountId dapat dihapus, dan nilai Account_id dapat diperoleh melalui metode GETAccount ().
3) Mengatur hubungan
A. Sintaksis:
--dalam service.hbm.xml, tambahkan konfigurasi hubungan asosiasi
-<nama banyak-ke-satu = "nama atribut asosiasi"
kolom = "Nama Bidang Relasional"
/>
B. Pelaksanaan:
<nama banyak-ke-satu = "akun"
kolom = "Account_id"
/>
4) Kode Sampel
Diketahui:
-Akun Properti Asosiasi
-Account_id Fieldsasatiated
--Account-> Akun Nama Tabel, ID Kunci Utama
<span style = "font-size: 14px;"> public void testFind () {session session = hibernateutil.getSession (); Layanan s = (service) session.get (service.class, 2002); System.out.println ("---- tampilkan informasi akun bisnis ----"); System.out.println (s.getId () + "" + s.getosusername () + "" + s.getunixhost ()); System.out.println ("--- Tampilkan Informasi Akun Terkait ---"); System.out.println (s.getAccount (). GetId () + "" + s.getAccount (). GetRealName ()); } </span>*4. Operasi terkait
1) kueri terkait
Jika Anda perlu menggunakan pernyataan SQL untuk membuat instantiate objek saat ini dan atribut yang terkait, Anda dapat menggunakan metode berikut:
A. (Tidak disarankan) Ubah pemetaan atribut terkait di HBM.XML
Atribut malas:
Benar berarti pemuatan malas diaktifkan;
salah berarti menutup pemuatan malas
Atribut ambil:
Bergabung berarti bahwa metode koneksi digunakan untuk menanyakan dengan objek utama. Saat ini, malas = "false" tidak valid;
SELECT (default) berarti mengirim data terkait kueri SQL secara terpisah
B. (Direkomendasikan) Lewati HQL dan bergabunglah dengan sintaksis
--dari akun gabungan ambil a.services di mana a.id =?
Artinya: Saat menanyakan objek akun, data atribut terkait layanan ditemukan bersama menggunakan koneksi tabel.
--FROM SNEK FETCH S.Account WHERE S.ID =?
Artinya: Saat meminta objek layanan, data atribut terkait akun ditemukan bersama menggunakan koneksi tabel.
--dari Layanan S Bergabunglah S.Account Where S.Account.id =?
Melihat:
- Objek dan properti ditulis dalam HQL
--Nein Fetch tidak memiliki klausa setelahnya, dan fetch terkait atribut
--query.setInteger untuk mengatur nilai parameter integer, dan subskrip dimulai dari 0.
--Jika jelas bahwa HQL hanya akan mengembalikan satu catatan, Anda dapat menggunakan metode kueri.Uniqueresult () untuk mengembalikan catatan unik
C. Kode sampel (tulis ulang kode kueri satu-ke-banyak di atas)
<span style = "font-size: 14px;"> public void testFind () {session session = hibernateutil.getSession (); // akun a = (akun) session.load (akun.class, 1010); String hql = "Dari akun A gabungan ambil a.services di mana a.id =?"; Kueri kueri = session.createqueery (hql); query.setInteger (0, 1010); //? Mulai dari 0 akun a = (akun) query.uniqueresult (); // kueri baris tunggal dapat menggunakan system.out.println ("--- Tampilkan informasi akun ----"); System.out.println (a.getId () + "" + a.getRealName () + "" + a.getIdcardno ()); System.out.println ("--- Tampilkan akun bisnis di bawah akun saat ini ----"); Set <servate> services = a.getServices (); untuk (layanan s: services) {System.out.println (s.getId () + "" + s.getosuserName () + "" + s.getunixhost ()); } System.out.println (a.toString ()); } </span> 2) Penambahan Cascading dan Modifikasi Cascading
A. Ketika tabel memiliki hubungan asosiasi, hibernasi tidak hanya menyediakan fungsi kueri asosiasi, tetapi juga memiliki kemampuan untuk menambah, memodifikasi, dan menghapus data dalam tabel asosiasi. Kemampuan ini disebut operasi cascading.
B. Cara mengimplementasikan operasi cascading
Anda perlu menambahkan kaskade atribut di lokasi di mana atribut terkait diatur.
--None: Cascading tidak didukung secara default
--Save-update: mendukung penambahan dan pembaruan cascading
--Delete: Mendukung penghapusan cascading
--sall: Mendukung penambahan, pembaruan, dan hapus cascading
C. Keterangan
Biasanya, ada hubungan tabel 1-ke-banyak. Satu sisi dari 1 adalah meja utama dan sisi lain dari 1 adalah tabel budak. Seringkali perlu untuk menambah, memperbarui, dan menghapus data tabel slave saat menambahkan, memperbarui, dan menghapus tabel utama. Misalnya: Saat menghapus akun, Anda harus menghapus data akun bisnis bersama.
3) Penghapusan Cascade
A. Atur cascade = "hapus" atau cascade = "semua" untuk mendukung penghapusan kaskade
B. Secara umum, perlu untuk menambahkan atribut invers = "true" pada tag set 1.
C. session.delete (OBJ); OBJ harus menjadi objek yang gigih, tidak mungkin baru, dan perlu dimuat/dapat diambil.
D. Metode untuk Penghapusan Batch:
Cascading Delete menggunakan pernyataan hapus n+1 untuk menghapus data yang terkait dari tabel utama dan tabel kunci asing.
Jika penghapusan batch , penghapusan cascading tidak disarankan. Disarankan untuk menggunakan HQL untuk menulis pernyataan Hapus Delete .
Hapus dari Layanan Where Account.id =? // Hapus semua data akun.id =? Di tabel layanan, (kalimat ini menggantikan n hapus pernyataan dalam operasi cascading)
hapus dari akun di mana id =?
4) Detail atribut (pemahaman) terbalik di sini
Apakah akan menyerahkan kontrol pemeliharaan hubungan. Artinya, secara default, hubungan antara akun dan objek layanan dikelola oleh kedua belah pihak. Ini berarti bahwa ketika melakukan operasi cascading pada objek akun atau layanan, Anda perlu menjalankan pernyataan pembaruan untuk mengatur bidang terkait ke ID yang sama. Jika Anda perlu membatalkan pekerjaan pemeliharaan hubungan dari pihak tertentu, Anda dapat menambahkan pengaturan terbalik = "benar" ke bagian atribut terkait, yang dapat menghindari pelaksanaan pernyataan pembaruan.
Benar: Hand Over Control, objek saat ini tidak bertanggung jawab untuk mempertahankan hubungan antara kedua tabel
Salah: Kontrol tidak diserahkan, objek saat ini harus bertanggung jawab untuk mempertahankan hubungan antara kedua tabel
Kiat: Sering diatur ke Inverse = "true" untuk satu pihak (mis., Bagian pemetaan <-satu-ke-banyak>) untuk terbalik = "true", sehingga sejumlah besar pernyataan pembaruan dapat dihindari ketika meng-cascading operasi di satu pihak.
*5. Asosiasi banyak-ke-banyak
Contoh: admin admin_info dan peran peran_info memiliki hubungan banyak-ke-banyak. Saya berharap ketika menanyakan administrator, dia dapat meminta perannya yang sesuai. Saat merancang database, perlu menggunakan 3 tabel untuk mewakilinya.
Admin_info (admin)
Admin_role (admin dan hubungan peran)
Peran (Peran)
1) Bidang hubungan
Bidang hubungan terletak di tabel menengah mereka admin_role,
admin_id = admin_info.id
role_id = role_info.id
2) Tambahkan atribut terkait menambahkan atribut terkait peran ke kelas entitas administrator
Atur <Peran> Peran
3) Tambahkan konfigurasi pemetaan asosiasi di admin.hbm.xml
--Syntax<set name="association attribute name" table="middle table name"> <key column="Admin's associated field name"/> <many-to-many column="Admin's associated field name"/> </set> --Code<set name="roles" table="admin_role"> <key column="admin_id"/> <many-to-many column="role_id"/> </set>
4) Operasi kaskade
Cascade berarti bahwa operasi kaskade didukung, dan meja beroperasi di sisi lain, daripada mewakili tabel perantara operasi kaskade. Untuk pemeliharaan tabel perantara, tidak perlu menulis atribut kaskade.
5) terbalik
Secara umum, banyak hubungan-banyak tidak perlu menulis invers = "true". Alasannya adalah ketika pihak lain memasukkan data, itu mungkin tidak memiliki data dalam tabel perantara, dan pihak saat ini perlu mempertahankannya. Oleh karena itu, terbalik = "true" tidak dapat ditulis. Kalau tidak, tidak ada pihak yang mempertahankan hubungan ini dan ada masalah dengan data.
6) Contoh Kode Java
<span style = "font-size: 14px;"> // hapus peran @test public void testDeleterole () {session session = hibernateutil.getSession (); Transaksi tx = session.begintransaction (); coba {admin a = (admin) session.load (admin.class, 1); Peran r1 = (peran) session.load (role.class, 1); a.getRoles (). Hapus (R1); session.update (a); tx.commit (); } catch (hibernateException e) {e.printstacktrace (); tx.rollback (); } akhirnya {session.close (); }} // Tambahkan peran @test public void testAddrole () {session session = hibernateutil.getSession (); Transaksi tx = session.begintransaction (); coba {admin a = (admin) session.load (admin.class, 1); Peran r1 = (peran) session.load (role.class, 1); Peran r2 = (peran) session.load (role.class, 43); Peran R3 = (peran) session.load (Role.class, 44); a.getRoles (). Add (r1); a.getRoles (). Add (r2); a.getRoles (). Add (r3); session.update (a); tx.commit (); } catch (hibernateException e) {e.printstacktrace (); tx.rollback (); } akhirnya {session.close (); }} @Test public void testFind () {session session = hibernateutil.getSession (); Transaksi tx = session.begintransaction (); coba {admin a = (admin) session.load (admin.class, 1); System.out.println ("----- Tampilkan informasi administrator ----"); System.out.println (a.getId () + "" + a.getName () + "" + a.gettelephone ()); System.out.println ("---- Tampilkan informasi peran administrator ---"); untuk (peran peran: a.getRoles ()) {System.out.println (role.getName () + ""); } tx.Commit (); } catch (hibernateException e) {e.printstacktrace (); tx.rollback (); } akhirnya {session.close (); }} </span>6. Asosiasi Warisan
Contoh: Cari produk di situs web e-commerce, seperti memasukkan iPhone untuk mencari. Hasil pencarian dapat mencakup informasi produk yang terkait dengan ponsel, film ponsel, kasus ponsel, pengisi daya, headphone, dll. Fungsi ini dapat diungkapkan dengan hubungan satu-ke-satu khusus saat merancang tabel. Artinya, atribut umum dari semua produk diekstraksi ke dalam produk meja umum. Hanya tabel produk spesifik yang disimpan dalam tabel produk tertentu, sehingga tabel produk spesifik dan tabel produk memiliki hubungan satu-ke-satu. Saat mencari, Anda hanya dapat mencari tabel produk, dan Anda dapat mencari informasi yang relevan.
-Produk Tabel Informasi Umum (ID, Nama, Harga, Desc)
-Buku Daftar Produk Buku (ID, Authod, Publishing, Words)
-Saya berharap bahwa ketika mengoperasikan tabel buku, saya dapat secara otomatis memelihara bidang umum ke dalam tabel produk.
1) Hubungan yang jelas
Buku dan produk memiliki hubungan satu-ke-satu. Tujuan dari hubungan ini adalah untuk menggunakan kembali bidang dalam tabel produk, seperti hubungan warisan.
2) Kelas Entitas
Buku memperluas produk
3) Hubungan terkait tercermin dalam file konfigurasi
-Jenis induk konsisten dengan metode penulisan file konfigurasi asli
-Subtipe memiliki karakteristik khusus
<joined-subclass name = "type name" TABLE = "TABLE NAME" EXTENDS = "NAMA KELAS ORELTE"> <KEY COLUMNER = "NAMA BIDANG ASOSICI"/> <NAMA PROPERTI = "" TYPE = "" COLUMN = ""/> ... </joined-ubclass>
4) Dalam hubungan warisan, karena kedua tabel memiliki hubungan yang mirip dengan orang tua dan anak, data dalam tabel induk harus dirujuk dalam tabel anak. Tidak ada kasus non-referensi, yaitu, tabel induk harus dipertahankan sambil mempertahankan tabel anak. Jadi ini adalah situasi yang tetap, jadi Anda tidak perlu menulis kaskade atau terbalik.
5) Kategori Deskripsi (mengerti)
<Ened-Subclass> Database memiliki tabel kelas induk dan tabel kelas anak
<Seratu-Subklas> Basis data memiliki tabel subkelas dan tidak ada tabel kelas induk (tabel subkelas sudah berisi bidang tabel kelas induk, tidak ada tabel kelas induk, tetapi memiliki objek entitas kelas induk)
<subclass> database memiliki kelas induk dan kelas anak dan menggunakan tabel (desainnya berantakan, yaitu, tidak ada pemisahan tabel, dan jarang digunakan)
*7. Kueri hibernasi
1) *Kueri HQL (Bahasa Permintaan Hibernate)
Itu milik pernyataan kueri yang berorientasi objek, menanyakan pojo yang dipetakan oleh Hibernate, sehingga menyadari permintaan database.
A. Gunakan kunci non-primer untuk membuat kueri bersyarat
-Parameter Kondisional? Menunjukkan bahwa query.setstring (0, "");
-Parameter bersyarat diwakili oleh: x, query.setstring ("x", "");
Kode contoh:
<span style = "font-size: 14px;"> // tes ke kueri secara kondisional dengan kunci non-primary @test public void testFind1 () {string hql = "from service where akun.id =? dan unixhost =?"; Sesi sesi = hibernateutil.getSession (); Kueri kueri = session.createqueery (hql); query.setInteger (0, 1011); query.setstring (1, "192.168.0.23"); Daftar <service> list = query.list (); untuk (layanan s: list) {system.out.println (s.getId () + "" + s.getosuserName () + "" + s.getunixhost ()); } session.close (); } // setara dengan testFind1, menggunakan ": identifikasi" bukan @test public void testFind2 () {string hql = "dari service where account.id =: aid dan unixhost =: host"; Sesi sesi = hibernateutil.getSession (); Kueri kueri = session.createqueery (hql); query.setInteger ("Aid", 1011); query.setstring ("host", "192.168.0.23"); Daftar <service> list = query.list (); untuk (layanan s: list) {system.out.println (s.getId () + "" + s.getosuserName () + "" + s.getunixhost ()); } session.close (); } </span> B. Hanya meminta beberapa atribut
-Koleksi yang dikembalikan default yang dienkapsulasi adalah objek []
--Men layanan (ID, Unixhost, Osusername) merangkum objek layanan dalam kombinasi yang dikembalikan.
Melihat:
Konstruktor yang perlu menambahkan tanggapan dalam layanan;
Jangan membuang konstruktor tanpa parameter;
Kode contoh:
<span style = "font-size: 14px;"> // Dapatkan beberapa hasil bidang, dan gunakan objek [] untuk merangkum data secara default @test public void testfind3 () {string hql = "pilih s.id, s.unixhost, s.osusername dari layanan s di mana s.Account.id =?"; Sesi sesi = hibernateutil.getSession (); Kueri kueri = session.createqueery (hql); query.setInteger (0, 1011); Daftar <object []> list = query.list (); untuk (objek [] objs: list) {system.out.println (objs [0] + "" + objs [1] + "" + objs [2] + ""); } session.close (); } // setara dengan testFind3, Anda perlu menambahkan konstruktor @test public void testFind4 () {string hql = "pilih layanan baru (s.id, s.unixhost, s.osusername) dari layanan s mana s.account.id =?"; Sesi sesi = hibernateutil.getSession (); Kueri kueri = session.createqueery (hql); query.setInteger (0, 1011); Daftar <service> list = query.list (); untuk (layanan s: list) {system.out.println (s.getId () + "" + s.getosuserName () + "" + s.getunixhost ()); } session.close (); } </span> C. Definisi HQL ada di file konfigurasi (hanya memahami)
--Tefin HQL dalam file konfigurasi melalui elemen kueri
-Query Element ditulis di belakang kelas
--session.getNamedQuery (nama HQL);
Kode Sampel: <Query/> dan <class/> ditempatkan di HBM.XML di level yang sama
<span style = "font-size: 14px;"> <query name = "findAll"> <!-termasuk bidang teks polos dalam cdata untuk mencegah karakter khusus-> <! [Cdata [dari layanan]]> </duery> </span> <span style = "font-size: 14px;"> // define hql ke hbml. testFind5 () {session session = hibernateutil.getSession (); // Dapatkan pernyataan HQL yang didefinisikan dalam <muery> di hbm.xml kueri kueri = session.getNamedQuery ("findAll"); Daftar <service> list = query.list (); untuk (layanan s: list) {system.out.println (s.getId () + "" + s.getosuserName () + "" + s.getunixhost ()); } session.close (); } </span> D. Kueri pagination
-Rekaman Query
query.setFirStresult ((halaman-1)*halaman);
query.setMaxResults (halaman);
--Query Total jumlah halaman
Pilih Hitung (*) dari Layanan
Kode contoh:
<span style = "font-size: 14px;"> // uji kueri paging @test public void testFind6 () {int page = 2; String hql = "dari layanan layanan oleh id"; Sesi sesi = hibernateutil.getSession (); Kueri kueri = session.createqueery (hql); // Tambahkan parameter paging untuk mengatur query.setFirStresult ((halaman - 1) * 3); // Atur titik awal untuk meraih catatan, mulai dari 0 query.setMaxResults (3); // Atur jumlah maksimum crawls no paging list = query. System.out.println (s.getId () + "" + s.getosusername () + "" + s.getunixhost ()); } session.close (); } // pilih count (*) dari service @test public void testFind7 () {string hql = "pilih count (*) dari service"; Sesi sesi = hibernateutil.getSession (); Kueri kueri = session.createqueery (hql); Ukuran Panjang = (Panjang) Query.Uliqueresult (); System.out.println ("Jumlah total catatan:" + ukuran); session.close (); } </span> e. Kueri terkait (ingat saja satu)
--dari layanan S, akun a
di mana s.account.id = a.id
--FROM LAYANAN S BAGIAN S.Account A
--select S.Account.RealName dari Layanan S
Meringkaskan:
Kesamaan antara HQL dan SQL :
--dukungan pilih, dari, di mana, grup, pesan demi klausa
--Menakan bagian dalam gabung, gabung kiri dan koneksi lainnya
--Support>, <,> =, <=, in, not in, antara, seperti dan kondisi lainnya
--Menakan fungsi statistik pengelompokan jumlah, jumlah, maks, min, rata-rata
Perbedaan antara HQL dan SQL :
-Pernyataan HQL sensitif terhadap kasus, yaitu sensitif kasus. Kata kunci tidak bisa dibedakan.
--HQL menulis nama objek dan nama atribut, bukan nama tabel dan nama bidang
-Klausa di bergabung tidak didukung
--select tidak didukung *
-Fungsi domain tidak didukung, seperti fungsi tanggal to_date (), fungsi karakter to_char (), dll.
2) kueri kriteria (tidak cukup intuitif, hanya mengerti)
Gunakan Hibernate API untuk mengeja HQL
Kriteria c = session.createCriteria (service.class);
Kode contoh:
<span style = "font-size: 14px;"> // Gunakan Hibernate's API untuk mengeja hql @test public void testFind1 () {session session = hibernateutil.getSession (); Kriteria c = session.createCriteria (service.class); c.add (pembatasan.and (pembatasan. Append sort // c.setFirStresult (arg0); // pagination // c.setmaxResults (arg0); untuk (layanan s: list) {system.out.println (s.getId () + "" + s.getosuserName () + "" + s.getunixhost ()); } session.close (); } </span> 3) Kueri SQL
Langsung membantu kami menghubungi JDBC untuk menjalankan kueri SQL
SqlQuery sqlQuery = session.createSqlQuery (sql);
Kode contoh:
<span style = "font-size: 14px;"> @test public void testFind1 () {string sql = "pilih * dari service"; Sesi sesi = hibernateutil.getSession (); SqlQuery sqlQuery = session.createSqlQuery (sql); sqlquery.setFirStresult (0); // pagination sqlquery.setmaxResults (3); // Secara default, array digunakan untuk merangkum daftar rekaman <object []> list = sqlQuery.list (); untuk (objek [] objs: daftar) {system.out.println (objs [0] + "" + objs [2]); } session.close (); } // Sama seperti testFind1 (), tentukan entitas yang merangkum catatan @test public void testFind2 () {string sql = "pilih * dari layanan"; Sesi sesi = hibernateutil.getSession (); SqlQuery sqlQuery = session.createSqlQuery (sql); sqlquery.setFirStresult (0); // pagination sqlquery.setmaxResults (3); // Tentukan kelas entitas yang merangkum catatan sqlquery.addentity (service.class); // Encapsulate Rekaman dengan Daftar Jenis Layanan yang Ditentukan <Service> Daftar = SQLQuery.List (); untuk (layanan s: list) {System.out.println (s.getId () + "" + s.getosuserName ()); } session.close (); } </span>8. Fitur Hibernate Advanced (Pemahaman)
1) Cache Level 2
A. Level 2 Cache (Default Off)
-Cache tingkat kedua adalah cache tingkat sesi, yang dikelola oleh sessionfactory
-Objek yang di-cache juga merupakan objek entitas
-Data yang dilapisi dapat dibagikan di antara berbagai sesi
-Lingkungan yang dapat diterapkan: Data objek yang sering dibagikan; frekuensi kecil perubahan data objek
B. Langkah untuk Menggunakan Cache Level 2
-Paket cache-dire ehcache.jar
--Import Cache Configuration File ehcache.xml
--in hibernate.cfg.xml, setel untuk mengaktifkan cache sekunder dan atur kelas driver cache
<span style = "font-size: 14px;"> <!-Menggunakan level 2 cache-> <properti name = "hibernate.cache.use_second_level_cache"> true </propert> <!-tentukan kelas driver ehcache.jar-> name = "hibernate.cache.provider_class"> org.hibernate.cache.ehcacheProvider </prop Propert> </span>
--Tet elemen dalam file pemetaan relasional HBM.XML dari pojo untuk di-cache <cache usage = "readonly"/>
Kode contoh:
<span style = "font-size: 14px;"> <span style = "font-size: 14px;"> @test public void testFind1 () {// untuk kueri pertama, gunakan session1 session1 session1 = hibernateutil.getSession (); Layanan s1 = (service) session1.get (service.class, 2002); System.out.println (s1.getosusername () + "" + s1.getunixhost ()); session1.close (); // Kueri kedua menggunakan session2 (setelah mengonfigurasi cache sekunder, kedua kueri pergi ke cache sekunder untuk mengambil data) // hibernateutil.getSessionFactory (). Excict (service.class); // Setelah dihapus, Anda masih kueri dua kali. Sesi sesi2 = hibernateutil.getSession (); Service s2 = (service) session2.get (service.class, 2002); System.out.println (s2.getosusername () + "" + s2.getunixhost ()); } </span> </span> 2) Cache kueri
A. Cache kueri
Caches Level 1 dan Level 2 hanya dapat menyimpan objek tunggal. Jika Anda menemukan hasil string, hasil array, atau koleksi daftar, Anda dapat menggunakan penyimpanan cache kueri.
-itu bisa dianggap sebagai cache level 2 khusus
-Ruang cache yang digunakan adalah cache tingkat kedua
-Cache adalah tipe data selain objek entitas
--Enel pada cache Level 2, itu dimatikan secara default, dan cache Level 2 harus dihidupkan sebelum dapat digunakan.
B. Gunakan langkah
--Open Level 2 Cache
--T Cache Query Terbuka di Hibernate.cfg.xml
<span style = "font-size: 14px;"> <!-Nyalakan cache kueri-> <name properti = "hibernate.cache.use_query_cache"> true </propert> </span>
Sebelum meminta -Query.list (), query.setCacheable (true);
C. Lingkungan penggunaan
-Pernyataan kueri yang sama yang perlu sering dieksekusi
-Hasil kueri mengatur perubahan konten frekuensi kecil
--Don tidak memiliki terlalu banyak data dalam set hasil. Kiat: Untuk SQL yang sama, buka database untuk pertama kalinya untuk meminta, dan keluar dari cache beberapa kali di masa depan. Karena konten set hasil SQL+ di -cache
Kode contoh:
<span style = "font-size: 14px;"> <span style = "font-size: 14px;"> @test public void testFind () {find (); System.out.println ("-------"); menemukan(); } private void find () {string hql = "dari service where account.id =?"; Sesi sesi = hibernateutil.getSession (); Kueri kueri = session.createqueery (hql); query.setInteger (0, 1011); // Aktifkan kueri Eksekusi cache kueri.setCacheable (true); Daftar <service> list = query.list (); untuk (layanan s: list) {System.out.println (s.getId () + "" + s.getosuserName ()); }} </span> </span>9. Hibernate Concurrent Processing-Locking
Misalnya:
Simulasi mekanisme pembelian tiket 12306, dengan asumsi saat ini ada tiket tiket (ID, line, jumlah, versi) tiket kereta api, dan mensimulasikan skenario di mana banyak orang membeli tiket pada saat yang sama.
1) Kunci pesimistis
-Program ini pesimistis bahwa setiap pengunjung memiliki masalah konkurensi, sehingga setiap bagian data akan dikunci. Kemudian, hanya ketika pengunjung saat ini yang memegang kunci melepaskan kunci, pengunjung berikutnya dapat mengakses data. Mekanisme ini disebut kunci pesimistis.
--Tidak, Anda harus mengunci data apa pun yang terjadi, terlepas dari apakah data akan memiliki konkurensi.
--Fitur
Efisiensi rendah dan keamanan tinggi
--menyelesaikan:
dapatkan (kelas, id, lockmode.upgrade)
Pilih * dari EMP untuk pembaruan
Catatan: Di sini kami menggunakan klausa pembaruan untuk pembaruan yang disertakan dengan database untuk mengunci, bukan mekanisme penguncian yang ditemukan oleh hibernate sendiri.
2) Kunci optimis
-Program ini optimis bahwa setiap pengunjung tidak akan memiliki masalah bersamaan, sehingga tidak menambah kunci. Sebaliknya, ketika data diperbarui, ditentukan apakah versi data telah berubah. Jika berubah, itu berarti bahwa ada kejadian bersamaan selama periode ini. Oleh karena itu, kesalahan dilaporkan dan pembaruan gagal.
-dengan bantuan bidang versi, ketika pengguna pertama memperbarui dan mengirimkan, hibernate akan memperbarui bidang dengan 1, sehingga bidang versi objek yang dikirimkan oleh pengguna berikutnya lebih kecil dari pada database, yaitu, ketika versi ditemukan untuk berubah selama pembaruan, pengecualian akan dilemparkan dan pembaruan akan gagal.
--Satu kesuksesan, kegagalan lainnya
--Fitur
Efisiensi tinggi, pengalaman pengguna yang buruk
--menyelesaikan
A. Anda perlu menambahkan bidang versi ke tabel untuk merekam versi data;
B. Tambahkan atribut versi ke kelas entitas;
C. Konfigurasi versi tambahan di hbm.xml <versi name = "" type = "" column = "">
3) Cara Memilih
--Jika konkurensi besar, kunci optimisme harus dipilih
--Jika konkurensinya kecil, Anda harus memilih kunci pesimistis
Di atas adalah analisis komprehensif dari operasi terkait hibernate, operasi kueri, fitur canggih, dan mekanisme pemrosesan konkurensi yang diperkenalkan oleh editor kepada Anda. Saya harap ini akan membantu Anda. Jika Anda memiliki pertanyaan, silakan tinggalkan saya pesan dan editor akan membalas Anda tepat waktu. Terima kasih banyak atas dukungan Anda ke situs web Wulin.com!