1. Siklus hidup objek yang gigih
Setelah aplikasi menggunakan kerangka Hibernate, objek persisten yang dibuat oleh aplikasi akan melalui serangkaian siklus hidup lengkap untuk menyelesaikan operasi basis data, di antaranya tiga negara utama bersifat sementara, kegigihan, dan terlepas. Transisi ketiga status ini dapat dikontrol dalam aplikasi, seperti yang ditunjukkan pada gambar di bawah ini:
Untuk memahami keadaan ini dengan jelas, berikut adalah contoh untuk melihat perbedaan antara objek di negara -negara ini. Kode -kode berikut di negara bagian adalah sebagai berikut:
(1) Buat perakitan hibernate_session dan tambahkan paket toples yang sesuai;
(2) Mengkonfigurasi Hibernate, tambahkan kelas pengguna entitas yang sesuai, dan file pemetaannya, dan konfigurasikan koneksi database yang sesuai;
File File Kelas Pengguna File File User.hbm.xml Kode:
<? Xml Version = "1.0"?> <! Doctype Hibernate-Mapping Public "-// Hibernate/Hibernate Mapping DTD 3.0 // EN" "http://hibernate.sourceForge.net/hibernate-mapping-3.3.3.dtd"> <! <Hibernate-Mapping> <class name = "com.hibernate.user"> <id name = "id"> <generator/> </d> <name properti = "name"/> <properti nama = "kata sandi"/> <name properti = "createTime"/> <name properti = "extreetime"/</class> </hibernate-papping>
Kode Konfigurasi Koneksi Basis Data Hibernate:
<? Xml Version = "1.0" Encoding = "UTF-8"?> <! Doctype Hibernate-Configuration Public "-// Hibernate/Hibernate Configuration Dtd 3.0 // en" "http://hibernate.sourceForge.net/hibernate-configuration-. name = "hibernate.connection.driver_class"> com.mysql.jdbc.driver </property> <property name = "hibernate.connection.url"> jdbc: mysql: // localhost: 3306/hibernate_session </properti </property name = "hibernate." name = "hibernate.connection.password"> ab12 </propt> <!-dialek: dialek, API yang mendasari yang dienkapsulasi, mirip dengan runtime, mengubah database menjadi bahasa yang sesuai dalam konfigurasi-> <nama properti = "hibernate.dialect"> org.hibernate.dialict.mysqysqysqysqysqysqysqysqysqysqysqysqysqysqysqysqysqysqysqysqysqysqysqysqysqysqysqysqysqysqysqysqysqysqysqysqysqysqysplandy> mapping> org.hibernate.dialect.mysqysqys.mysqys. resource = "com/hibernate/user.hbm.xml"/> </sion-factory> </hibernate-configuration>
(3) Tambahkan kelas publik dari SesionFactory anggota statis untuk membuat sessionFactory dan objek sesi;
paket com.hibernate; impor org.hibernate.Session; impor org.hibernate.SessionFactory; impor org.hibernate.cfg.configuration; Sesi Kelas Publik {Private Static SessionFactory Factory; // Deklarasikan variabel lokal statis sessionFactory, database mirror static {try {// buat dan dapatkan file konfigurasi untuk database konfigurasi, dan dapatkan hibernate.cfg.xml cfgg = konfigurasi baru (). Configure (); pabrik = cfg.buildsessionFactory (); // Bangun gambar basis data} catch (pengecualian e) {e.printstacktrace (); // Cetak Pesan Kesalahan}} Sesi statis publik getSession () {return factory.opensession (); // kembalikan objek sesi yang dibuat} public static sessionFactory getSessionFactory () {return factory; // kembalikan sesi yang sesuai} // tutup objek sesi public static void closeSession (sesi sesi) {if (session! = Null) {if (session.isopen ()) {session.close (); }}}}}(4) Tambahkan folder sumber, dan tambahkan paket bernama com.hibernate di folder, dan tambahkan file kelas bernama sessionTest ke paket.
paket com.hibernate; impor java.util.date; impor junit.framework.testcase; impor org.hibernate.Session; impor org.hibernate.transaction; Kelas publik sessiontest memperluas testcase {} 2. Metode Konversi Negara
1. Objek langsung memasuki keadaan persisten
1.1 Dapatkan metode
Dapatkan deretan informasi dari database dan menyinkronkan informasi ke dalam objek yang dibuat. Metode ini mengembalikan objek objek dan mengembalikan nol jika tidak ada konten yang ditemukan. Contoh berikut menggunakan metode Get Sesi untuk mendapatkan objek dan mengubah objek menjadi instance.
public void testget1 () {session session = null; Transaksi tx = null; coba {session = hibernateutils.getSession (); // buka transaksi tx = session.begintransaction (); // Objek yang dimuat oleh GET adalah objek yang persisten // Execute dapat mengeluarkan pernyataan kueri segera, dan jika tidak ada, itu akan mengembalikan pengguna null user = (user) session.get (user.class, "FF80808145BC28CC0145BC28CE020002"); System.out.println (user.getName ()); // status persisten // objek dengan keadaan persisten berubah ketika properti objek berubah // hibernate akan menyinkronkan user.setname ("zhao liu"); session.getTransaction (). Commit (); } catch (Exception e) {E.PrintStackTrace (); if (tx! = null) {tx.rollback (); }} akhirnya {hibernateutils.closession (sesi); }} Atur breakpoint untuk mendapatkan objek pengguna.
Objek ini diperoleh dan objek pengguna diperoleh setelah casting. Metode SetName ditambahkan ke program, yang berarti bahwa nama dalam database akan diperbarui. Setelah eksekusi selesai, database akan diperiksa, seperti yang ditunjukkan pada gambar di bawah ini untuk memperbarui hasilnya.
1.2 METODE LOAD
Fungsi ini mirip dengan metode GET, dan juga memperoleh data dari database dan menyinkronkannya ke dalam objek. Metode ini mendukung operasi malas. Ini mengembalikan objek objek yang persisten atau proxy, sehingga perlu dikonversi.
public void testload1 () {session session = null; coba {session = hibernateutils.getSession (); // Pernyataan kueri tidak akan segera diperiksa karena beban mendukung malas (tunda beban/beban malas) // Apa yang harus diajarkan malas? Hanya ketika objek ini benar -benar digunakan dan kemudian dibuat, pernyataan kueri akan dikeluarkan untuk Hibernate. Ini terutama untuk meningkatkan kinerja. Malas adalah fitur yang sangat penting dalam Hibernate. Bagaimana malas hibernate diimplementasikan? Diimplementasikan oleh objek proxy. Objek proksi terutama menggunakan // yang dihasilkan oleh perpustakaan CGLIB alih -alih proxy dinamis JDK, karena proxy dinamis JDK hanya dapat menghasilkan proxy untuk kelas yang menerapkan alasan. CGLIB dapat menghasilkan // proxy untuk kelas. Ini mengadopsi metode warisan pengguna pengguna = (user) session.load (user.class, "8a1b653745bcc7b50145bcc7b7b7140001"); System.out.println (user.getName ()); // status persisten // objek dengan keadaan persisten, ketika properti objek berubah // hibernate akan menyinkronkan user.setname ("zhaoliu"); session.getTransaction (). Commit (); } catch (Exception e) {E.PrintStackTrace (); } akhirnya {hibernateutils.closesession (sesi); }} Kueri untuk mendapatkan objek pengguna seperti yang ditunjukkan pada gambar di bawah ini:
Menganalisis gambar di atas, objek pengguna yang diperoleh tidak lengkap, atau tidak ada objek pengguna yang umum, tetapi itu adalah proxy. Ini menggunakan CGLIB untuk memuatkan objek dan hanya benar -benar dibuat saat menggunakan objek.
1.3 Dapatkan VS LOAD
Metode mendapatkan dan memuat sangat penting. Mereka sering diambil selama wawancara dengan Hibernate. Berikut ini adalah perbandingan dari dua berikut.
Kesamaan:
(1) fungsi -fungsi tersebut sama, dan data hubungan dikonversi menjadi objek;
(2) Metode penggunaannya sama, dan dua perbedaan dalam parameter juga diperlukan:
(1) Metode pemuatan mendukung operasi malas, preloads objek, dan dibuat hanya saat digunakan. Dapatkan langsung mengubah data relasional menjadi objek;
(2) Jika objek beban beban tidak ada, ObjectNotFoundException akan dilemparkan, dan jika GET tidak mendapatkan data, itu akan mengembalikan NULL.
2. Bangun objek terpisah secara manual
Ada metode lain untuk mendapatkan objek. Ini berbeda dari metode GET dan LOAD. Ini adalah metode manual. Pertama, suatu objek adalah umum, dan kemudian data objek diperoleh dengan merumuskan ID. Metode ini adalah sebagai berikut:
public void testuer () {session session = null; coba {session = hibernateutils.getSession (); session.begintransaction (); // membangun secara manual pengguna ObjectUser = baru pengguna (); user.setid ("8A1B653745BCC7B50145BCC7B7B7140001"); // status persisten // objek dengan keadaan persisten, ketika properti objek berubah // hibernate akan menyinkronkan session.getTransaction (). commit () dengan database saat membersihkan cache (pemeriksaan data kotor); } catch (Exception e) {E.PrintStackTrace (); } akhirnya {hibernateutils.closesession (sesi); }} Lihat diagram hasil yang diperoleh:
Diagram hasil analisis digunakan dalam kode untuk mengatur nomor ID untuk objek. Setelah nomor ID diformulasikan, objek dapat dioperasikan. Setelah transaksi dikirimkan, itu disinkronkan ke database, dan spesifikasi manual digunakan untuk secara manual menentukan informasi objek.
2.1 Hapus metode
Untuk menghapus objek yang ditentukan dalam database, objek harus dikonversi ke keadaan persisten sebelum menghapusnya. Anda dapat menggunakan metode GET, Load atau Manual untuk menentukan objek. Metode ini adalah sebagai berikut:
session = hibernateutils.getSession (); session.begintransaction (); Pengguna pengguna = (user) session.load (user.class, "8a1b653745bcc6d50145bcc6d67a0001"); // disarankan untuk menggunakan metode ini untuk menghapus, memuat terlebih dahulu dan kemudian menghapus session.delete (pengguna);
2.2 UPDATE
Perbarui data, metode ini akan memodifikasi data dalam database. Saat menggunakannya, akan ada situasi dalam jumlah, yang akan memperbarui nilai bidang tertentu dalam database atau memperbarui seluruh baris database.
2.2.1 Perbarui Nilai Bidang
Jika Anda hanya ingin memperbarui nilai bidang tertentu, sebelum memperbarui, Anda perlu menggunakan beban atau dapat mengubah objek menjadi kode status persisten sebagai berikut:
// Dapatkan sesi sesi sesi = hibernateutils.getSession (); // buka transaksi session.begintransaction (); // atau Anda dapat menggunakan metode lain untuk mengaktifkan //session.getTransaction (). Begin (); // Muat untuk mendapatkan objek pengguna // Metode 1: Gunakan metode muat // pengguna pengguna = (user) session.load (user.class, "8a1b653745bcc7b50145bcc7b7b7140001"); // Metode 2: Secara manual mendapatkan pengguna pengguna = pengguna baru (); user.setid ("8A1B653745BCC7B50145BCC7B7B7140001"); // perbarui nama user.setname ("zhangsan"); session.update (pengguna); session.getTransaction (). Commit ();2.2.2 Perbarui seluruh baris <BR /> Jika Anda ingin memperbarui data seluruh baris, Anda dapat secara manual mengonversi negara ke keadaan terpisah dan secara manual menentukan nilai ID objek. Kodenya adalah sebagai berikut:
// Dapatkan sesi sesi sesi = hibernateutils.getSession (); // buka transaksi session.begintransaction (); // atau dapat menggunakan metode lain untuk mengaktifkan //session.getTransaction (). Begin (); // secara manual mendapatkan pengguna pengguna = pengguna baru (); user.setid ("8A1B653745BCC7B50145BCC7B7B7140001"); // perbarui nama user.setname ("zhangsan"); session.update (pengguna); session.getTransaction (). Commit (); Lihat Hasil Pembaruan:
Menganalisis hasil pembaruan, itu sebenarnya memperbarui seluruh baris data database. Ada terlalu banyak ketidakpastian dalam operasi pembaruan ini dan tidak disarankan untuk menggunakannya.
2.3 Simpan metode
Masukkan data. Saat mengeksekusi metode simpan, pernyataan insert database dipanggil untuk menambahkan baris baru ke database. Objek yang disimpan akan dikonversi menjadi keadaan persisten. Dalam keadaan ini, objek dapat memperbarui objek lagi dan akan diperbarui ke database dengan perubahan ketika transaksi akhirnya dikirimkan. sebagai berikut:
public void testSave2 () {session session = null; Transaksi tx = null; coba {session = hibernateutils.getSession (); // buka transaksi tx = session.begintransaction (); // status transien pengguna pengguna = pengguna baru (); user.setname ("zhangsi"); user.setPassword ("123"); user.setCreateTime (tanggal baru ()); user.setexpiretime (tanggal baru ()); // status persisten // objek dengan keadaan persisten berubah ketika properti objek berubah // hibernate akan menyinkronkan session.save (pengguna); user.setname ("lisi"); tx.commit (); } catch (Exception e) {E.PrintStackTrace (); if (tx! = null) {tx.rollback (); }} akhirnya {hibernateutils.closession (sesi); } // status terpisah} Lihat Tampilan Hasil Jalankan contoh sebelumnya:
Hasil analisis: Sesi sebenarnya melakukan dua operasi saat mengirimkan transaksi. Dikombinasikan dengan proses pembaruan dalam kode, pertama, objek pengguna baru ditambahkan, dan kemudian operasi simpan dijalankan. Ini akan memanggil pernyataan insert, maka operasi setName dilakukan dalam kode, dan namanya dimodifikasi ulang. Namun, belum disinkronkan ke database saat ini tetapi dalam memori. Saat ini, akan ada dua negara bagian. Kami mengatakan bahwa bit data saat ini adalah data kotor, dan akhirnya memperbarui ke database saat mengirimkan transaksi.