Pengecualian "gagal memulakan koleksi peranan" Hibernate boleh timbul apabila cuba mengakses koleksi yang dimuatkan dengan malas di luar konteks sesi. Untuk menyelesaikan isu ini, mari kita mendalami senario tertentu:
Kod yang disediakan mentakrifkan perhubungan @OneToMany dalam model Topik, dipetakan oleh model Komen. Dalam pengawal anda, anda mendapatkan semula contoh Topik dan ulasannya. Paparan JSP kemudiannya mengulangi ulasan untuk memaparkannya. Walau bagaimanapun, ini mencetuskan pengecualian kerana koleksi komen dimuatkan secara lalai.
Untuk membetulkannya, anda mempunyai dua pilihan:
1. Eager Loading:
Kemas kini pemetaan medan komen dalam Topik untuk menggunakan eager loading:
@OneToMany(fetch = FetchType.EAGER, mappedBy = "topic", cascade = CascadeType.ALL) private Collection<Comment> comments = new LinkedHashSet<>();
Eager loading memastikan koleksi komen dimulakan apabila Topik dimuatkan, menghalang pengecualian.
2. Malas Memuatkan dengan Sesi Terbuka:
Sebagai alternatif, anda boleh mengekalkan koleksi ulasan sebagai dimuatkan secara malas, tetapi pastikan sesi Hibernate dibuka apabila mengakses ulasan:
Dalam pengawal anda:
Topic topicById = service.findTopicByID(id); // Start a new Hibernate session Session session = sessionFactory.getCurrentSession(); Collection<Comment> commentList = topicById.getComments(); // Close the session once done session.close(); // Pass the commentList to the view //...
Dengan membuka sesi baharu dalam pengawal, Hibernate mempunyai yang diperlukan konteks untuk memulakan koleksi ulasan. Ingat untuk menutup sesi dengan jelas apabila selesai.
Ingat bahawa pemuatan yang tidak sabar-sabar mungkin mempunyai implikasi prestasi pada koleksi yang lebih besar, jadi pilih pendekatan yang paling sesuai dengan keperluan aplikasi anda.
Atas ialah kandungan terperinci Bagaimana untuk Memperbaiki Hibernate\'gagal untuk malas memulakan koleksi peranan\' Pengecualian?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!