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:
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!