Rumah > Java > javaTutorial > teks badan

## Mengapa Kriteria Hibernate dengan FetchType.EAGER Menghasilkan Objek Pesanan Pendua?

Mary-Kate Olsen
Lepaskan: 2024-10-26 03:50:28
asal
489 orang telah melayarinya

## Why Does Hibernate Criteria with FetchType.EAGER Result in Duplicate Order Objects?

Kriteria Hibernate Mengembalikan Pesanan Berbilang Berulang dengan FetchType.EAGER

Masalah:

Apabila menggunakan Kriteria Hibernate dengan FetchType.EAGER untuk perhubungan satu-ke-banyak, senarai yang terhasil mengandungi berbilang salinan objek Pesanan yang sama.

Kod Asal:

<code class="java">public List<OrderTransaction> getOrderTransactions() {
    return orderTransactions;
}</code>
Salin selepas log masuk
Salin selepas log masuk

Kod Diubah Suai dengan FetchType.EAGER:

<code class="java">public List<OrderTransaction> getOrderTransactions() {
    return orderTransactions;
}</code>
Salin selepas log masuk
Salin selepas log masuk

Soalan:

Mengapa kod yang diubah suai dengan FetchType.EAGER menghasilkan berbilang salinan objek Pesanan?

Jawapan:

Tingkah laku ini dijangka apabila mendayakan pengambilan yang bersemangat. Gabungan dilakukan antara jadual Pesanan dan Urusniaga, menghasilkan bilangan baris yang sama seperti gabungan SQL biasa. Oleh itu, setiap objek Pesanan muncul berbilang kali, sepadan dengan bilangan rekod Urusniaga Pesanan yang berkaitan.

Penjelasan:

Sambungan luar digunakan apabila mengambil data dengan FetchType.EAGER . Ini bermakna walaupun Pesanan tidak mempunyai rekod Urusniaga Pesanan yang berkaitan, ia akan tetap disertakan dalam set hasil. Hasilnya ialah senarai objek Pesanan, setiap satu berpotensi dikaitkan dengan berbilang objek Urus Niaga.

Penyelesaian:

Untuk mengelakkan berbilang salinan objek Pesanan, pertimbangkan untuk menggunakan set bukannya senarai untuk mengelakkan pendua. Sebagai alternatif, gunakan DistinctRootEntity dalam pertanyaan Kriteria, yang secara eksplisit menentukan objek Pesanan yang berbeza untuk dikembalikan.

Contoh:

<code class="java">Criteria criteria = getHibernateSession()
        .createCriteria(Order.class)
        .setResultTransformer(CriteriaSpecification.DISTINCT_ROOT_ENTITY)
        .add(Restrictions.in("orderStatus", orderFilter.getStatusesToShow()));</code>
Salin selepas log masuk

Atas ialah kandungan terperinci ## Mengapa Kriteria Hibernate dengan FetchType.EAGER Menghasilkan Objek Pesanan Pendua?. 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
Artikel terbaru oleh pengarang
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!