Maison >Java >javaDidacticiel >Hibernate MultipleBagFetchException : Comment résoudre les problèmes de récupération impatiente lors de la création de SessionFactory ?

Hibernate MultipleBagFetchException : Comment résoudre les problèmes de récupération impatiente lors de la création de SessionFactory ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-12-12 13:46:10711parcourir

Hibernate MultipleBagFetchException: How to Resolve Eager Fetching Issues During SessionFactory Creation?

Hibernate : correction de MultipleBagFetchException lors de la création de SessionFactory

Lors de l'utilisation d'Hibernate, vous pouvez rencontrer une exception lors de la création de SessionFactory :

org.hibernate.loader.MultipleBagFetchException: cannot simultaneously fetch multiple bags

Cela se produit généralement lors de la récupération rapide de plusieurs collections d'entités (en utilisant FetchType.EAGER) au sein d’une entité. Cela peut entraîner des problèmes de performances, une incohérence des données et une surcharge de mémoire.

Cas de test :

Considérez l'exemple suivant :

@Entity
public class Parent {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @OneToMany(mappedBy = "parent", fetch = FetchType.EAGER)
    private List<Child> children;

}

@Entity
public class Child {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @ManyToOne
    private Parent parent;

}

Dans Dans ce cas, la récupération de Parent.children tente avec impatience de récupérer simultanément plusieurs collections d'enfants, ce qui conduit à exception.

Solutions potentielles :

1. Supprimez FetchType.EAGER :

Supprimez FetchType.EAGER du mappage Parent.children. Cela amènera Hibernate à récupérer paresseusement les enfants en cas de besoin, résolvant ainsi l'exception. Cependant, cela peut affecter les performances.

2. Utilisez LazyCollection :

Annotez le champ enfants avec @LazyCollection(LazyCollectionOption.FALSE) au lieu d'utiliser FetchType.EAGER. Cela demande à Hibernate de charger la collection avec impatience, mais via un processus d'initialisation paresseux, évitant ainsi l'exception.

3. Utiliser un Set :

Dans la plupart des cas, il est préférable d'utiliser Set au lieu de Liste dans la cartographie. Les ensembles ne sont pas ordonnés et n'autorisent pas les doublons, éliminant ainsi le risque de problèmes de produit cartésien.

Attention :

L'utilisation d'ensembles n'élimine pas le problème sous-jacent du produit cartésien, car discuté par Vlad Mihalcea. Cependant, il s’agit généralement d’une meilleure approche et peut améliorer les performances.

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