"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">
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>();
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:
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!