Rumah >Java >javaTutorial >Bagaimana untuk Menyelesaikan MultipleBagFetchException Hibernate Semasa Permulaan SessionFactory?
MultipleBagFetchException dalam Hibernate: Pengambilan Berbilang Beg Serentak
Hibernate menemui org.hibernate.loader.MultipleBagFetchException secara serentak apabila cuba mengambil beberapa beg serentak semasa permulaan SessionFactory. Pengecualian ini nyata dalam senario berikut:
Entiti Induk mengekalkan perhubungan dengan berbilang entiti Anak menggunakan perkaitan OneToMany. Dalam kelas Induk, harta kanak-kanak mewakili koleksi objek Kanak-kanak.
Apabila menggunakan FetchType.EAGER pada harta kanak-kanak, Hibernate cuba memuatkan semua entiti Anak yang dikaitkan dengan Ibu Bapa semasa penciptaan SessionFactory. Walau bagaimanapun, ini membawa kepada pengecualian MultipleBagFetchException kerana Hibernate tidak boleh mengambil berbilang beg secara serentak (iaitu, koleksi kanak-kanak) daripada pangkalan data.
Untuk menyelesaikan isu ini, adalah disyorkan untuk mengalih keluar atribut FetchType.EAGER daripada @ Anotasi OneToMany. Sebagai alternatif, anda boleh menganotasi medan koleksi dengan @LazyCollection(LazyCollectionOption.FALSE) untuk mencapai strategi pengambilan Eager yang sama.
Pertimbangan Tambahan
Dalam kes di mana Ibu Bapa entiti mengandungi entiti lain dengan koleksi FetchType.EAGER, seperti AnotherParent dengan koleksi Objek AnotherChild, Hibernate juga akan menemui MultipleBagFetchException. Ini berlaku kerana Hibernate tidak dapat mengendalikan pengambilan Eager serentak berbilang koleksi.
Untuk menangani isu ini, tukar atribut FetchType.EAGER kepada @LazyCollection(LazyCollectionOption.FALSE) untuk kedua-dua koleksi Parent dan AnotherParent. Ingat, menggunakan Set dan bukannya Senarai untuk koleksi boleh mengurangkan kemungkinan menghadapi pengecualian ini.
Awas:
Menggunakan Set tidak menghapuskan isu Produk Cartesian yang mendasari, kerana diterangkan oleh Vlad Mihalcea dalam jawapan lain. Itulah sebabnya penting untuk menggunakan pengambilan Eager dengan berhati-hati, dengan berhati-hati mempertimbangkan implikasi prestasi dan potensi kesan sampingan.
Atas ialah kandungan terperinci Bagaimana untuk Menyelesaikan MultipleBagFetchException Hibernate Semasa Permulaan SessionFactory?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!