Rumah  >  Artikel  >  Java  >  Mengapa Kriteria Hibernate Mengembalikan Berbilang Salinan Kanak-kanak Apabila Menggunakan FetchType.EAGER?

Mengapa Kriteria Hibernate Mengembalikan Berbilang Salinan Kanak-kanak Apabila Menggunakan FetchType.EAGER?

DDD
DDDasal
2024-10-27 04:29:29412semak imbas

Why Does Hibernate Criteria Return Multiple Copies of Children When Using FetchType.EAGER?

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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn