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
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!