Maison > Java > javaDidacticiel > le corps du texte

Pourquoi les critères d'hibernation renvoient-ils plusieurs copies d'enfants lors de l'utilisation de FetchType.EAGER ?

DDD
Libérer: 2024-10-27 04:29:29
original
504 Les gens l'ont consulté

Why Does Hibernate Criteria Return Multiple Copies of Children When Using FetchType.EAGER?

Les critères Hibernate renvoient plusieurs copies d'enfants avec FetchType.EAGER

Lors du mappage d'une relation un-à-plusieurs dans Hibernate, telle que Classe de commande ayant une liste de OrderTransactions, il est courant d'utiliser le paramètre FetchType.EAGER pour récupérer avec impatience les entités enfants lors de l'initialisation du parent. Cependant, un phénomène curieux se produit lors de l'utilisation de ce paramètre avec les critères Hibernate.

Résultats de la requête Répéter les commandes

Considérez le scénario suivant : Une classe Order est définie avec une liste de OrderTransactions et une requête Criteria sont utilisées pour filtrer les commandes en fonction de leur orderStatus. Avec le paramètre FetchType.LAZY par défaut, la liste de résultats contient des instances de commande uniques comme prévu. Mais lors de la définition de FetchType.EAGER pour le mappage OrderTransaction, les instances de commande commencent à apparaître plusieurs fois dans les résultats.

Comportement attendu avec FetchType.EAGER

Bien que le comportement de Les commandes répétées avec FetchType.EAGER peuvent sembler inattendues, elles correspondent au comportement SQL sous-jacent. Lorsqu'une jointure externe est effectuée (ce qui se produit en raison de FetchType.EAGER), l'ensemble de résultats contient toutes les combinaisons potentielles d'entités parent et enfant, ce qui entraîne des instances parent dupliquées lorsque plusieurs entités enfants existent.

Solution

Pour obtenir des résultats de commande distincts même avec FetchType.EAGER, Hibernate propose une solution de contournement :

<code class="java">Collection result = new LinkedHashSet(session.createCriteria(...).list());</code>
Copier après la connexion

Cet extrait de code utilise un LinkedHashSet pour filtrer les références de commande en double, garantissant ainsi que le résultat list ne contient que des instances de commande uniques.

Alternativement, si l'objectif est d'empêcher complètement la récupération des jointures et de s'en tenir au chargement paresseux, rétablissez simplement le paramètre FetchType sur FetchType.LAZY.

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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal