Maison > Java > javaDidacticiel > Comment réparer l'exception « Échec de l'initialisation paresseuse d'une collection de rôles » d'Hibernate ?

Comment réparer l'exception « Échec de l'initialisation paresseuse d'une collection de rôles » d'Hibernate ?

Patricia Arquette
Libérer: 2024-11-29 10:09:10
original
848 Les gens l'ont consulté

How to Fix Hibernate's

Élimination de l'exception Hibernate « Échec de l'initialisation paresseuse d'une collection de rôles »

L'exception Hibernate « Échec de l'initialisation paresseuse d'une collection de rôles » peut survenir lors d'une tentative d'accès une collection chargée paresseusement en dehors d’un contexte de session. Pour résoudre ce problème, examinons le scénario spécifique :

Le code fourni définit une relation @OneToMany dans le modèle Topic, mappée par le modèle Comment. Dans votre contrôleur, vous récupérez une instance de Topic et ses commentaires. La vue JSP parcourt ensuite les commentaires pour les afficher. Cependant, cela déclenche l'exception car la collection de commentaires est chargée par défaut.

Pour rectifier cela, vous avez deux options :

1. Chargement hâtif :

Mettez à jour le mappage du champ de commentaires dans le sujet pour utiliser le chargement hâtif :

@OneToMany(fetch = FetchType.EAGER, mappedBy = "topic", cascade = CascadeType.ALL)
private Collection<Comment> comments = new LinkedHashSet<>();
Copier après la connexion

Le chargement hâtif garantit que la collection de commentaires est initialisée lorsque le sujet est chargé, empêchant ainsi le exception.

2. Chargement paresseux avec session ouverte :

Vous pouvez également conserver la collection de commentaires en mode chargement paresseux, mais assurez-vous que la session Hibernate est ouverte lors de l'accès aux commentaires :

Dans votre contrôleur :

Topic topicById = service.findTopicByID(id);

// Start a new Hibernate session
Session session = sessionFactory.getCurrentSession();

Collection<Comment> commentList = topicById.getComments();

// Close the session once done
session.close();

// Pass the commentList to the view
//...
Copier après la connexion

En ouvrant une nouvelle session au sein du contrôleur, Hibernate dispose du contexte nécessaire pour initialiser la collection de commentaires. N'oubliez pas de fermer explicitement la session une fois terminée.

N'oubliez pas que le chargement rapide peut avoir des implications en termes de performances sur des collections plus volumineuses. Choisissez donc l'approche qui correspond le mieux aux besoins de votre application.

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