Rumah > Java > javaTutorial > Bagaimana untuk Menyelesaikan Pengecualian Hibernate \'gagal untuk malas memulakan koleksi peranan\'?

Bagaimana untuk Menyelesaikan Pengecualian Hibernate \'gagal untuk malas memulakan koleksi peranan\'?

Barbara Streisand
Lepaskan: 2024-11-29 00:34:12
asal
988 orang telah melayarinya

How to Solve the Hibernate Exception

"gagal untuk malas memulakan koleksi peranan: mvc3.model.Topic.comments, tiada sesi atau sesi ditutup" Pengecualian Hibernate: Panduan Komprehensif

Pengecualian ini, yang biasa ditemui dalam persekitaran Hibernate, menyerlahkan isu dengan mengakses data yang tidak dimulakan. Memahami punca dan mencari penyelesaian yang betul adalah penting untuk menyelesaikan ralat ini.

Memahami Masalah:

Dalam Hibernate, pengambilan data menggunakan gabungan pemuatan segera (semangat mengambil) dan memuatkan tertunda (mengambil malas). Secara lalai, koleksi dan perkaitan diambil secara malas, bermakna ia hanya dimuatkan daripada pangkalan data apabila diminta secara khusus.

Dalam senario yang diberikan, kelas entiti Topik mengandungi koleksi ulasan (medan ulasan). Apabila mengakses koleksi ini di luar sesi atau selepas sesi ditutup, Hibernate membuang pengecualian "gagal untuk malas memulakan koleksi peranan".

Menyiasat Kod:

Kod yang disediakan termasuk kelas entiti Topik, pengawal (TopicController) dan paparan JSP (details.jsp). Kaedah TopicController (perincian) mendapatkan semula topik (contoh Topik) mengikut IDnya dan mendapatkan semula koleksi ulasan (topicById.getComments()). Koleksi ini kemudiannya dihantar ke paparan JSP.

Menganalisis Paparan JSP:

Paparan JSP menggunakan gelung JSTL c:forEach untuk mengulangi koleksi ulasan. Baris ini merujuk item sebagai item:

<c:forEach items="${commentList}" var="item">
Salin selepas log masuk

Punca Pengecualian:

Pengecualian berlaku kerana koleksi ulasan belum dimulakan lagi. Memandangkan paparan JSP berada di luar sesi Hibernate, percubaan untuk mengakses koleksi menyebabkan ralat "gagal untuk malas memulakan koleksi peranan".

Penyelesaian: Eager Fetching

Untuk menyelesaikan pengecualian ini, pengambilan bersemangat boleh digunakan. Ini melibatkan memuatkan koleksi ulasan bersama-sama dengan topik apabila topik itu diambil daripada pangkalan data. Dalam kelas entiti Topik, ubah suai medan ulasan seperti berikut:

@OneToMany(fetch = FetchType.EAGER, mappedBy = "topic", cascade = CascadeType.ALL)
private Collection<Comment> comments = new LinkedHashSet<Comment>();
Salin selepas log masuk

Dengan berbuat demikian, Hibernate akan mengambil koleksi ulasan serta-merta apabila topik dimuatkan. Ini menghapuskan keperluan untuk pemulaan malas dan menyelesaikan pengecualian.

Alternatif untuk Pengambilan Bersemangat:

Dalam kes tertentu, pengambilan bersemangat mungkin bukan penyelesaian pilihan, kerana ia boleh mengakibatkan prestasi menurun kerana memuatkan lebih banyak data daripada yang diperlukan. Alternatif termasuk:

  • Memastikan sesi Hibernate masih terbuka apabila mengakses koleksi.
  • Menggunakan kaedah Hibernate.initialize() eksplisit untuk memaksa pemula.
  • Menimbang menggunakan pendekatan entiti terpisah.

Memahami Lazy Loading dan Implikasi:

Pemuatan malas ialah ciri yang direka untuk meningkatkan prestasi dengan memuatkan data hanya apabila ia diperlukan. Walau bagaimanapun, ia memerlukan sesi dibuka untuk permulaan. Jika sesi ditutup atau tidak dibuka, mengakses koleksi yang tidak dimulakan akan mengakibatkan pengecualian "gagal memulakan koleksi secara malas".

Atas ialah kandungan terperinci Bagaimana untuk Menyelesaikan Pengecualian Hibernate \'gagal untuk malas memulakan koleksi peranan\'?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan