Rumah >Java >javaTutorial >## Mengapa Kriteria Hibernate dengan FetchType.EAGER Menghasilkan Objek Pesanan Pendua?

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

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-10-26 03:50:28592semak imbas

## 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>

Kod Diubah Suai dengan FetchType.EAGER:

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

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>

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!

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