Menguruskan Sesi Hibernate untuk Mengelakkan LazyInitializationException
Ralat "org.hibernate.LazyInitializationException: tidak dapat memulakan proksi - tiada Sesi" sering timbul apabila mengakses entiti yang dimulakan malas di luar skop sesi Hibernate. Artikel ini menangani isu ini dengan meneroka penyelesaian tanpa mengubah konfigurasi pemuatan malas.
Isunya
Dalam coretan kod yang disediakan, kaedah getModelByModelGroup pada mulanya dilaksanakan tanpa sesi yang betul pengendalian, membawa kepada pengecualian. Percubaan untuk mengawal sesi dan memulakan transaksi secara manual juga gagal menyelesaikan ralat.
Penyelesaian Cadangan
Untuk mengelakkan isu ini, pelbagai pendekatan boleh dipertimbangkan:
Anotasi kelas yang mengandungi kaedah getModelByModelGroup dengan @Transactional. Spring akan mengurus pengendalian sesi secara automatik, menghapuskan keperluan untuk sesi manual dan kawalan transaksi. Ini memastikan bahawa kaedah dilaksanakan dalam urus niaga, menghalang pengecualian pemulaan malas.
@Transactional public class MyClass { public Model getModelByModelGroup(int modelGroupId) { ... } }
Buat secara manual dan tutup sesi Hibernate dalam skop kaedah getModelByModelGroup. Ini memberikan kawalan yang jelas ke atas pengurusan sesi, tetapi memerlukan pengendalian yang teliti untuk mengelakkan kebocoran sumber.
public Model getModelByModelGroup(int modelGroupId) { Session session = SessionFactoryHelper.getSessionFactory().openSession(); try (session) { // using Java 9+ syntax // perform database operations } catch (Exception ex) { // handle exception } }
Pertimbangkan untuk mereka bentuk semula seni bina aplikasi untuk mencipta cache berskop atau corak objek capaian data yang mengurus sesi Hibernate dan entiti yang dimulakan secara malas. Ini mengurangkan keperluan untuk pengendalian sesi manual.
Nota Tambahan
Atas ialah kandungan terperinci Bagaimana untuk Mencegah LazyInitializationException Hibernate Tanpa Melumpuhkan Lazy Loading?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!