Hibernate n'a pas pu initialiser le proxy - pas de session
Mon code récupère toutes les informations relatives à l'utilisateur:
SessionFactory sessionFactory = HibernateUtilities.configureSessionFactory();
Session session = sessionFactory.openSession();
UserDetails ud = null;
Set<Address> userAddress = null;
try {
session.beginTransaction();
ud = (UserDetails) session.get(UserDetails.class, 1);
userAddress = ud.getAddresses();
session.getTransaction().commit();
} catch (HibernateException e) {
e.printStackTrace();
session.getTransaction().rollback();
} finally {
session.close();
}
System.out.println(ud.getName());
for(Address addr: userAddress){
System.out.println("State " + addr.getState());
}
La ud.getAddresses()
retourne simplement un ensemble de Address
es de l'utilisateur.
Ma question est: pourquoi ne le ud
objet disposer encore de sa valeur (par exemple, nom), même si la session est déjà fermé? getAddresses()
est une variable d'instance de la UserDetails
classe. Mais pourquoi je ne peux pas récupérer de sa valeur, mais je peux les récupérer régulièrement des variables d'instance de la UserDetails
classe?
ud.getAddresses()
est un @EmbeddedCollection
.
source d'informationauteur KyelJmD | 2012-11-21
Vous devez vous connecter pour publier un commentaire.
La documentation hibernate pour travailler avec les associations paresseux clairement appelle ce type d'accès comme une erreur. Vous pouvez interagir avec paresseusement objets associés seulement si la session est toujours ouverte. La partie de la documentation fournit également des solutions de rechange à accéder à de tels paresseusement membres associés d'un objet et que nous préférons pour spécifier le mode de lecture que la JOINTURE dans les critères utilisés, dans nos applications.
J'ai fait face à la même question en JPA/Hibernate, et il y a 2 façons de résoudre ce problème:
1/éteindre le PARESSEUX par défaut, comme suit:
Bien sûr, ce chemin n'est pas recommandé en raison de la question de performance, de sorte que vous pouvez aller à la seconde.
2/Vous pouvez mettre @Transactional au début de votre méthode, il peut vous aider à rester à la session, ou d'une autre compréhension, il passe le devoir de la session mise en veille prolongée, comme suit:
Ma réponse est tardive, mais l'espoir d'aider quelqu'un d'autre 🙂
Toutes les primitives propriétés des classes sont chargés tout de suite, ils ne peuvent pas être paresseux, sauf si vous utilisez le bytecode des améliorations. Seul véritable associations comme la votre collection peut être paresseux.