Rumah > Java > javaTutorial > teks badan

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

DDD
Lepaskan: 2024-10-27 04:29:29
asal
434 orang telah melayarinya

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>
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!