Hibernate: Membetulkan MultipleBagFetchException Semasa SessionFactory Creation
Apabila menggunakan Hibernate, anda mungkin menghadapi pengecualian semasa pembuatan SessionFactory:
org.hibernate.loader.MultipleBagFetchException: cannot simultaneously fetch multiple bagsIni biasanya disebabkan apabila mengambil berbilang koleksi entiti dengan penuh semangat (menggunakan FetchType.EAGER) dalam entiti. Ini boleh membawa kepada isu prestasi, ketidakkonsistenan data dan overhed memori.Kes Ujian:
Pertimbangkan contoh berikut:@Entity public class Parent { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @OneToMany(mappedBy = "parent", fetch = FetchType.EAGER) private List<Child> children; } @Entity public class Child { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @ManyToOne private Parent parent; }
Potensi Penyelesaian:
1. Alih keluar FetchType.EAGER:
Alih keluar FetchType.EAGER daripada pemetaan Parent.children. Ini akan menyebabkan Hibernate dengan malas mengambil kanak-kanak apabila diperlukan, menyelesaikan pengecualian. Walau bagaimanapun, ia mungkin menjejaskan prestasi.2. Gunakan LazyCollection:
Annotate medan kanak-kanak dengan @LazyCollection(LazyCollectionOption.FALSE) dan bukannya menggunakan FetchType.EAGER. Ini mengarahkan Hibernate untuk memuatkan koleksi dengan tidak sabar-sabar, tetapi melalui proses permulaan yang malas, mengelakkan pengecualian.3. Gunakan Set:
Dalam kebanyakan kes, adalah lebih baik untuk menggunakan SetAwas:
Menggunakan set tidak menghapuskan isu produk Cartesian yang mendasari, kerana dibincangkan oleh Vlad Mihalcea. Walau bagaimanapun, ia secara amnya merupakan pendekatan yang lebih baik dan boleh meningkatkan prestasi.Atas ialah kandungan terperinci Hibernate MultipleBagFetchException: Bagaimana untuk Menyelesaikan Isu Pengambilan Bersemangat Semasa SessionFactory Creation?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!