Dari forum Hibernate :
Ini dari buku Hibernate in Action. Bagus membaca ini ..
Mengambil objek dengan pengidentifikasi Potongan kode Hibernate berikut mengambil objek pengguna dari database:
User user = (User) session.get(User.class, userID);
Metode get () adalah khusus karena pengenal secara unik mengidentifikasi satu instance kelas. Oleh karena itu, aplikasi umum untuk menggunakan pengenal sebagai pegangan yang nyaman untuk objek yang persisten. Pengambilan dengan pengenal bisa menggunakan cache saat mengambil objek, menghindari database yang terkena jika objek sudah di-cache. Hibernate juga menyediakan metode load ():
User user = (User) session.load(User.class, userID);
Metode load () lebih lama; get () ditambahkan ke API Hibernate karena permintaan pengguna. Perbedaannya sepele:
Jika load () tidak dapat menemukan objek dalam cache atau database, pengecualian akan dilemparkan. Metode load () tidak pernah mengembalikan nol. Metode get () mengembalikan null jika objek tidak dapat ditemukan.
Metode load () mungkin mengembalikan proxy alih-alih instance persisten yang nyata. Proksi adalah placeholder yang memicu pemuatan objek nyata saat diakses pertama kali; Di sisi lain, get () tidak pernah mengembalikan proxy. Memilih antara get () dan load () itu mudah: Jika Anda yakin objek persisten ada, dan tidak ada akan dianggap luar biasa, load () adalah pilihan yang baik. Jika Anda tidak yakin ada instance persisten dengan pengenal yang diberikan, gunakan get () dan uji nilai yang dikembalikan untuk melihat apakah nilainya null. Menggunakan load () memiliki implikasi lebih lanjut: Aplikasi dapat mengambil referensi yang valid (proxy) ke instance persisten tanpa menyentuh database untuk mengambil status persistennya. Jadi, load () mungkin tidak memunculkan pengecualian jika tidak menemukan objek persisten dalam cache atau database; pengecualian akan dilempar nanti, saat proxy diakses. Tentu saja, mengambil objek dengan pengenal tidak sefleksibel menggunakan kueri arbitrer.
Setidaknya dalam nhibernate, session.Get (id) akan memuat objek dari database, sedangkan session.Load (id) hanya membuat objek proxy untuk itu tanpa meninggalkan server Anda. Bekerja seperti setiap properti lazy-loaded lainnya di POCO Anda (atau POJOs :). Anda kemudian dapat menggunakan proxy ini sebagai referensi ke objek itu sendiri untuk membuat hubungan, dll.
Anggap saja seperti memiliki objek yang hanya menyimpan Id dan yang akan memuat sisanya jika Anda membutuhkannya. Jika Anda hanya menyebarkannya untuk membuat hubungan (seperti FK), id adalah semua yang Anda butuhkan.
sumber
session.load () akan selalu mengembalikan "proxy" (istilah Hibernate) tanpa menyentuh database. Dalam Hibernate, proxy adalah objek dengan nilai pengenal yang diberikan, propertinya belum diinisialisasi, hanya terlihat seperti objek palsu sementara. Jika tidak ada baris yang ditemukan, ObjectNotFoundException akan muncul.
session.get () selalu menekan database dan mengembalikan objek sebenarnya, sebuah objek yang mewakili baris database, bukan proxy. Jika tidak ada baris yang ditemukan, itu mengembalikan null.
Performa dengan metode ini juga membuat berbeda. antara dua ...
sumber
Satu poin ekstra lagi ::
Metode get kelas Sesi Hibernasi mengembalikan null jika objek tidak ditemukan di cache dan juga di database. sedangkan metode load () melontarkan ObjectNotFoundException jika objek tidak ditemukan di cache serta di database tetapi tidak pernah mengembalikan null.
sumber
Satu konsekuensi tidak langsung dari penggunaan "load" daripada "get" adalah penguncian optimis menggunakan atribut version mungkin tidak berfungsi seperti yang Anda harapkan. Jika pemuatan hanya membuat proxy dan tidak membaca dari database, properti versi tidak dimuat. Versi tersebut hanya akan dimuat ketika / jika Anda nanti merujuk ke properti pada objek, memicu pemilihan. Sementara itu, sesi lain dapat memperbarui objek, dan sesi Anda tidak akan memiliki versi asli yang diperlukan untuk melakukan pemeriksaan kunci optimis - sehingga pembaruan sesi Anda akan menimpa pembaruan sesi lain tanpa peringatan.
Berikut adalah upaya untuk membuat sketsa skenario ini dengan dua sesi yang bekerja dengan objek dengan pengenal yang sama. Versi awal untuk objek di DB adalah 10.
Session 1 Session 2 --------- --------- Load object Wait a while.. Load object Modify object property [triggers db 'select' - version read as 10] Commit [triggers db update, version modified to 11] Modify object property [triggers db 'select' - version read as 11] Commit [triggers db update, version modified to 12]
Kami sebenarnya ingin komitmen sesi 1 gagal dengan pengecualian kunci optimis, tetapi akan berhasil di sini.
Menggunakan "get" daripada "load" akan mengatasi masalah tersebut, karena get akan segera mengeluarkan pilihan, dan nomor versi akan dimuat pada waktu yang tepat untuk pemeriksaan kunci yang optimis.
sumber
Juga kita harus berhati-hati saat menggunakan load karena akan memunculkan eksepsi jika obyek tidak ada. Kita harus menggunakannya hanya jika kita yakin objek itu ada.
sumber
Penjelasan yang sangat baik ditemukan di http://www.mkyong.com/hibernate/different-between-session-get-and-session-load
session.load ():
Ini akan selalu mengembalikan "proxy" (istilah Hibernate) tanpa mengenai database.
Dalam Hibernate, proxy adalah objek dengan nilai pengenal yang diberikan, propertinya belum diinisialisasi, hanya terlihat seperti objek palsu sementara.
Itu akan selalu mengembalikan objek proxy dengan nilai identitas yang diberikan, bahkan nilai identitas tidak ada dalam database. Namun, ketika Anda mencoba untuk menginisialisasi proxy dengan mengambil propertinya dari database, itu akan mengenai database dengan pernyataan pilih. Jika tidak ada baris yang ditemukan, ObjectNotFoundException akan muncul.
session.get ():
Itu selalu mengenai database (jika tidak ditemukan di cache) dan mengembalikan objek sebenarnya, sebuah objek yang mewakili baris database, bukan proxy.
Jika tidak ada baris yang ditemukan, itu mengembalikan null.
sumber
load () tidak dapat menemukan objek dari cache atau database, pengecualian dilempar dan metode load () tidak pernah mengembalikan null.
Metode get () mengembalikan null jika objek tidak dapat ditemukan. Metode load () mungkin mengembalikan proxy alih-alih instance persisten nyata get () tidak pernah mengembalikan proxy.
sumber