Rumah  >  Artikel  >  Java  >  Mengapa Kriteria Hibernate Mengembalikan Pesanan Pendua dengan FetchType.EAGER?

Mengapa Kriteria Hibernate Mengembalikan Pesanan Pendua dengan FetchType.EAGER?

Barbara Streisand
Barbara Streisandasal
2024-10-26 01:40:28659semak imbas

Why Does Hibernate Criteria Return Duplicate Orders with FetchType.EAGER?

Kriteria Hibernate Mengembalikan Pesanan Pendua dengan FetchType.EAGER

Pertimbangkan pemetaan Hibernate berikut:

@OneToMany(targetEntity = OrderTransaction.class, cascade = CascadeType.ALL)
public List<OrderTransaction> getOrderTransactions() {
    return orderTransactions;
}

Dengan ini pemetaan, anda boleh menapis pesanan menggunakan medan OrderStatus mereka:

public List<Order> getOrderForProduct(OrderFilter orderFilter) {
    Criteria criteria = getHibernateSession()
            .createCriteria(Order.class)
            .add(Restrictions.in("orderStatus", orderFilter.getStatusesToShow()));
    return criteria.list();
}

Walau bagaimanapun, apabila jenis pengambilan ditetapkan secara eksplisit kepada EAGER, senarai yang terhasil mengandungi pesanan pendua.

Sebab untuk Pendua

Dengan FetchType.EAGER, Hibernate melakukan operasi gabungan untuk mengambil Transaksi Pesanan yang berkaitan. Akibatnya, setiap Pesanan dalam senarai yang terhasil akan diduakan untuk setiap Urus Niaga Pesanan yang berkaitan. Ini ialah gelagat yang dijangkakan dalam senario ini.

Mencapai Keputusan Yang Cemerlang

Untuk mendapatkan pesanan yang berbeza walaupun mengambil yang tidak sabar-sabar, anda boleh menggunakan kod berikut dalam pertanyaan Kriteria anda:

Criteria criteria = getHibernateSession()
            .createCriteria(Order.class, "o")
            .setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);

Sumber Tambahan

Untuk mendapatkan maklumat lanjut tentang tingkah laku ini, rujuk sumber berikut:

  • [Soalan Lazim Hibernate on Distinct Keputusan untuk Pengambilan Sertaan Luar](https://docs.jboss.org/hibernate/orm/5.3/javadocs/faq/FAQ.html#ch02s01)
  • [Penjelasan Gavin King tentang SQL Outer Joins dan Gelagat Hibernate ](http://www.hibernate.org/42.html)

Atas ialah kandungan terperinci Mengapa Kriteria Hibernate Mengembalikan Pesanan Pendua dengan 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