Hibernate-Kriterien geben doppelte Bestellungen mit FetchType.EAGER zurück
Berücksichtigen Sie die folgende Hibernate-Zuordnung:
@OneToMany(targetEntity = OrderTransaction.class, cascade = CascadeType.ALL) public List<OrderTransaction> getOrderTransactions() { return orderTransactions; }
Damit Zuordnung können Sie Bestellungen anhand ihres orderStatus-Felds filtern:
public List<Order> getOrderForProduct(OrderFilter orderFilter) { Criteria criteria = getHibernateSession() .createCriteria(Order.class) .add(Restrictions.in("orderStatus", orderFilter.getStatusesToShow())); return criteria.list(); }
Wenn der Abruftyp jedoch explizit auf EAGER festgelegt ist, enthält die resultierende Liste doppelte Bestellungen.
Der Grund für Duplikate
Mit FetchType.EAGER führt Hibernate eine Join-Operation durch, um die zugehörigen OrderTransactions eifrig abzurufen. Infolgedessen wird jede Bestellung in der resultierenden Liste für jede zugehörige OrderTransaction dupliziert. Dies ist das erwartete Verhalten in diesem Szenario.
Eindeutige Ergebnisse erzielen
Um trotz des Eager Fetching eindeutige Bestellungen zu erhalten, können Sie den folgenden Code in Ihrer Kriterienabfrage verwenden:
Criteria criteria = getHibernateSession() .createCriteria(Order.class, "o") .setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);
Zusätzliche Ressourcen
Weitere Erkenntnisse zu diesem Verhalten finden Sie in den folgenden Ressourcen:
Das obige ist der detaillierte Inhalt vonWarum geben Hibernate-Kriterien doppelte Bestellungen mit FetchType.EAGER zurück?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!