Kriteria Hibernate Mengembalikan Berbilang Salinan Kanak-kanak dengan FetchType.EAGER
Apabila memetakan hubungan satu-dengan-banyak dalam Hibernate, seperti Kelas pesanan yang mempunyai senarai OrderTransactions, adalah perkara biasa untuk menggunakan tetapan FetchType.EAGER untuk mengambil entiti anak dengan penuh semangat semasa permulaan induk. Walau bagaimanapun, fenomena aneh timbul apabila menggunakan tetapan ini dengan Kriteria Hibernate.
Pesanan Ulangan Keputusan Pertanyaan
Pertimbangkan senario berikut: Kelas Pesanan ditakrifkan dengan senarai OrderTransactions, dan pertanyaan Kriteria digunakan untuk menapis pesanan berdasarkan OrderStatus mereka. Dengan tetapan FetchType.LAZY lalai, senarai hasil mengandungi contoh Pesanan unik seperti yang dijangkakan. Tetapi apabila menetapkan FetchType.EAGER untuk pemetaan OrderTransaction, kejadian Pesanan mula muncul beberapa kali dalam hasil carian.
Gelagat yang Dijangka dengan FetchType.EAGER
Walaupun tingkah laku Pesanan berulang dengan FetchType.EAGER mungkin kelihatan tidak dijangka, ia sejajar dengan tingkah laku SQL yang mendasari. Apabila gabungan luar dilakukan (yang berlaku disebabkan oleh FetchType.EAGER), set hasil mengandungi semua potensi gabungan entiti induk dan anak, yang mengakibatkan contoh induk pendua apabila wujud berbilang entiti anak.
Penyelesaian
Untuk mendapatkan hasil Pesanan yang berbeza walaupun dengan FetchType.EAGER, Hibernate menyediakan penyelesaian:
<code class="java">Collection result = new LinkedHashSet(session.createCriteria(...).list());</code>
Coretan kod ini menggunakan LinkedHashSet untuk menapis rujukan Pesanan pendua, memastikan hasilnya list hanya mengandungi contoh Pesanan yang unik.
Sebagai alternatif, jika matlamatnya adalah untuk menghalang pengambilan gabungan sepenuhnya dan kekal dengan pemuatan malas, hanya kembalikan tetapan FetchType kembali kepada FetchType.LAZY.
Atas ialah kandungan terperinci Mengapa Kriteria Hibernate Mengembalikan Berbilang Salinan Kanak-kanak Apabila Menggunakan FetchType.EAGER?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!