Artikel ini menjelaskan prinsip dan metode implementasi pemuatan penundaan hibernasi. Bagikan untuk referensi Anda, sebagai berikut:
Untuk lebih mengoptimalkan kinerja Hibernate, Anda dapat menggunakan:
Teknologi pemuatan latensi, mengelola strategi merangkak data, dan melakukan manajemen cache untuk meningkatkan kinerja hibernate.
1. Penundaan pemuatan (muat)
Pemuatan Lazy adalah mekanisme yang disediakan oleh Hibernate untuk meningkatkan efisiensi eksekusi program, yaitu, itu akan dibuat hanya ketika data objek sebenarnya digunakan.
Proses pemuatan malas: Penundaan pemuatan dicapai melalui mekanisme proxy. Ketika Hibernate memperoleh data dari objek tertentu dari database, ketika memperoleh nilai atribut koleksi suatu objek, atau ketika mendapatkan objek lain yang terkait dengan objek, karena data objek tidak digunakan (kecuali pengidentifikasi), Hibernate tidak memuat data nyata dari database, tetapi hanya membuat objek proxy untuk objek untuk mewakili objek. Semua atribut pada objek ini adalah nilai default; Objek nyata ini dibuat hanya ketika data objek benar -benar perlu digunakan, dan datanya sebenarnya dimuat dari database.
Ketika metode muat () pada sesi dipanggil untuk memuat entitas; Ketika sesi memuat entitas, nilai atribut koleksi di entitas akan dimuat dengan pemuatan yang tertunda; Ketika sesi memuat suatu entitas, objek entitas lain yang entitasnya berujung tunggal, pemuatan yang tertunda akan digunakan untuk objek entitas lain yang terkait dengan endapan tunggal
Matikan Lazy Loading: Saat memuat satu entitas, Anda dapat menggunakan metode get ().
Untuk atribut koleksi di entitas, Anda dapat menambahkan atribut lazy = "false" ke set ini (<set>, <bag>, <list> ...). Ketika asosiasi tunggal dari objek entitas lain, Anda dapat mengonfigurasi <satak satu-ke-satu>, <-banyak-ke-satu> untuk menambahkan atribut Lazy = "false" dalam file pemetaan Catatan: One-to-One tidak dapat dibatasi = Benar (Kunci asing ditampilkan dalam pernyataan SQL yang dihasilkan), jika tidak, pemuatan malas tidak akan berfungsi.
2. Jenis utama pemuatan malas digunakan dalam hibernasi secara default:
• Pemuatan malas digunakan saat metode pemuatan () pada sesi dipanggil untuk memuat entitas.
• Ketika sesi memuat entitas, nilai atribut koleksi dalam entitas ini dimuat dengan penundaan. (satu-ke-banyak)
• Ketika sesi memuat entitas, objek entitas lain yang berujung tunggal (satu-ke-satu, banyak-ke-satu) yang terkait dengan entitas malas dimuat.
• Perbedaan antara yang kedua dan ketiga adalah: dalam kasus kedua, metode untuk membatalkan pemuatan penundaan adalah untuk mengatur atribut pemuatan malas malas = "false" setelah tag set dari file pemetaan satu pihak yang memiliki atribut set; Dalam kasus ketiga, tag banyak-ke-satu dalam file pemetaan dari beberapa pihak yang memiliki banyak-ke-satu, yaitu, tag banyak-ke-satu diatur.
Objek yang dapat dimuat malas adalah semua objek proxy yang ditulis ulang. Ketika sesi yang terkait tidak ditutup, mengakses properti dari objek yang dimuat malas ini (proxy) (kecuali getid dan getClass) hibernate akan menginisialisasi proxy ini, atau menggunakan hibernate.Initialize (proxy) untuk menginisialisasi objek proxy; Ketika sesi terkait ditutup, pengecualian akan terjadi untuk mengakses objek yang dimuat malas.
3. Strategi Perayapan (Fetch)
Konfigurasikan "Kebijakan Perayapan" untuk secara langsung mempengaruhi efek kueri dari metode get () dan muat () dari sesi.
Strategi Perayapan pada Asosiasi Akhir Single <-Many-to-One> <One-to_one>:
Anda dapat menambahkan atribut pengambilan ke elemen pemetaan terkait tunggal. Pilih: Penundaan pemuatan; Bergabunglah: Gunakan koneksi intra-koneksi dalam pernyataan SELECT yang sama untuk mendapatkan data objek dan data objek terkaitnya. Pada saat ini, penundaan pemuatan objek terkait tidak valid.
Strategi merangkak pada properti pengumpulan :
Pilih: Penundaan pemuatan; Bergabunglah: Gunakan intra-loining dalam pernyataan pilih yang sama untuk mendapatkan set asosiasi pihak lain. Pada saat ini, malas pada set yang terkait akan tidak valid. Subselect: Kirim pernyataan kueri atau subquery lain untuk merangkak. Strategi ini juga berfungsi untuk pertanyaan HQL.
4. Analisis Kasus Beban Malas
Kasus 1: Entitas tunggal memanggil metode pemuatan () untuk membatalkan pemuatan malas
Paket com.hbsi.test; impor org.hibernate.Session; impor org.junit.test; import com.hbsi.domain.user; import com.hbsi.utils.hibernateutil; metode testLazy {// test get () metode () Metode akan selalu mengeksekusi pernyataan sql @testpublic {// get () Metode () akan selalu mengeksekusi pernyataan sql @testpublic {// get () Metode () akan selalu mengeksekusi pernyataan sql @testpublic @testpublicer () Metode () akan selalu mengeksekusi pernyataan SQL SQL @testpublic @testpublic () Hibernateutil.getSession (); pengguna pengguna = (user) session.get (user.class, 1); // system.out.println (user.getname ()); hibernateutil.close (); // Catatan di sini: bahkan jika sesi ditutup dan pengguna dalam keadaan yang dikelola, objek pengguna masih dapat digunakan; Ini karena meskipun dalam keadaan terkelola, objek ini adalah objek dengan nilai atribut dan tidak menghapusnya, tetapi hanya mengisolasi saluran untuk berurusan dengan database. System.out.println (user.getName ());} // Metode testLoad (); Jangan jalankan pernyataan SQL, dan hanya jalankan @testpublicvoid testLoad () {session session = hibernateutil.getSession (); user user = (user) session.load (user.class, 1); // ID output di sini tidak akan menjalankan pernyataan SQL. Ini akan secara langsung mendapatkan ID dari ID yang Anda lewati di atas. Tidak dicari dari database, jadi SQL Pernyataan System.out.println (user.getId ()); // Nama output berbeda. Pada saat ini, objek proxy sebenarnya dipakai. Ini adalah objek proxy dengan atribut nama. Pada saat ini, bahkan jika Anda menutup sesi, Anda masih bisa mendapatkan nama melalui objek ini. If you comment this sentence, that is, the proxy object does not instantiate the proxy object, and then execute the output name attribute after closing the session, an error will be reported: could not initialize proxy// System.out.println(user.getName());HibernateUtil.close();System.out.println(user.getName());}}Situasi 2: Batalkan pemuatan malas di set
Uji Jika beban malas dalam atribut koleksi diatur ke false dalam file pemetaan, itu akan disatukan dengan data dalam tabel pesanan, yaitu dua pernyataan terpilih
@Testpublicvoid find () {session session = hibernateutil.getSession (); customer cus = (customer) session.get (customer.class, 3); System.out.println (cus.getcname ()); // Gunakan metode berikut untuk menghasilkan pernyataan SQL selama dua hari, dan mereka dipisahkan; Jika pemuatan malas digunakan, dua pernyataan SQL akan menjadi output terlebih dahulu, dan hasil output adalah // Metode tidak dapat secara langsung dirantai di sini untuk mengeluarkan cus.getord (). getOname (); karena cus.getord () mengembalikan set set set <desers> pesanan = cus.getord (); system.err.println (orders.size ()); hibernateutil.close ();}Metode 3: <-satu-ke-satu>, <dane-to-one> Batalkan pemuatan malas
@Testpublicvoid find () {// Secara default, malas memuat, yaitu, output satu dengan pernyataan SQL; Jika penundaan pemuatan diatur ke false dan output dua pernyataan SQL, informasi pelanggan yang tidak diinginkan akan ditemukan. Sesi sesi = hibernateutil.getSession (); orders ord = (orders) session.get (orders.class, 3); System.out.println (ord.getoname ()); hibernateutil.close ();}Saya berharap deskripsi dalam artikel ini akan membantu pemrograman Java semua orang berdasarkan kerangka hibernasi.