Maison  >  Article  >  Java  >  ## Pourquoi les critères de mise en veille prolongée avec FetchType.EAGER entraînent-ils des objets de commande en double ?

## Pourquoi les critères de mise en veille prolongée avec FetchType.EAGER entraînent-ils des objets de commande en double ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-10-26 03:50:28490parcourir

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

Les critères Hibernate renvoient plusieurs commandes répétées avec FetchType.EAGER

Problème :

Lors de l'utilisation un critère Hibernate avec FetchType.EAGER pour une relation un-à-plusieurs, la liste résultante contient plusieurs copies du même objet Order.

Code original :

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

Code modifié avec FetchType.EAGER :

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

Question :

Pourquoi le code modifié avec FetchType.EAGER entraîne-t-il plusieurs des copies de l'objet Order ?

Réponse :

Ce comportement est attendu lors de l'activation de la récupération rapide. Une jointure est effectuée entre les tables Order et OrderTransaction, ce qui donne le même nombre de lignes qu'une jointure SQL standard. Par conséquent, chaque objet Order apparaît plusieurs fois, correspondant au nombre d'enregistrements OrderTransaction associés.

Explication :

Une jointure externe est utilisée lors de la récupération de données avec FetchType.EAGER . Cela signifie que même si une commande n’a aucun enregistrement OrderTransaction associé, elle sera toujours incluse dans l’ensemble de résultats. Le résultat est une liste d'objets Order, chacun potentiellement associé à plusieurs objets OrderTransaction.

Solution :

Pour éviter plusieurs copies de l'objet Order, pensez à utiliser un ensemble au lieu d'une liste pour éviter les doublons. Vous pouvez également utiliser un DistinctRootEntity dans la requête Criteria, qui spécifie explicitement les objets Order distincts à renvoyer.

Exemple :

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

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn