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

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

DDD
DDDoriginal
2024-10-27 04:29:29412parcourir

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>

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!

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