Maison > Java > javaDidacticiel > le corps du texte

## 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
Libérer: 2024-10-26 03:50:28
original
489 Les gens l'ont consulté

## 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>
Copier après la connexion
Copier après la connexion

Code modifié avec FetchType.EAGER :

<code class="java">public List<OrderTransaction> getOrderTransactions() {
    return orderTransactions;
}</code>
Copier après la connexion
Copier après la connexion

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>
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!