[Hibernate 3.0] LazyInitializationException
Bonsoir, j'utilise la version de 3.0 de Hibernate,
Cette dernière, utilise le lazy loading par défaut pour charger les collections d'objets.
En exécutant le code suivant (qui a pour but de récupérer les galleries auxquelles un user à accès):
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
|
public ArrayList<GalleryDAO> findGalleriesForMember(MemberDAO memberDAO) {
// Result list
ArrayList<GalleryDAO> galleryAL = null;
try {
Session session = HibernateHelper.currentSession();
// Query creation
Query query = session
.createQuery("from GalleryDAO as galleryDAO inner join galleryDAO.groupL as groupDAO where groupDAO in (:groupList)");
// Query parameter
query.setParameterList("groupList", memberDAO.getAccess()
.getGroups()); //!!!Le problème à lieu ici
// Getting result list
galleryAL = (ArrayList<GalleryDAO>) query.list();
} catch (Exception e) {
logger.logError("Erreur de requête", e);
} finally {
HibernateHelper.closeSession();
}
return galleryAL;
} |
j'ai cette exception qui est levée:
Code:
1 2 3
|
2006-01-30 22:03:37,243 [http-80-Processor22] ERROR org.hibernate.LazyInitializationException - failed to lazily initialize a collection of role: com.toto.website.hibernate.pojo.AccessDAO.groups, no session or session was closed
org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: com.toto.website.hibernate.pojo.AccessDAO.groups, no session or session was closed |
Le problème vient (d'après ce que j'ai pu comprendre) du fait que l'attribut "groups" de la classe "AccessDAO" qui compose "MemberDAO" ne peut être chargé à la demande dans cette session...
Alors ma première question est:
- Pourquoi?? Est ce que cela vient du fait que la session dans laquelle je travaille n'est pas la même que celle qui à loadé initialement le "MemberDAO"??
...
Ensuite en ajoutant cette ligne dans la méthode:
Code:
1 2
|
session.lock(memberDAO.getAccess(), LockMode.NONE); |
tout rentre dans l'ordre. Cette instruction à pour but de rattacher une instance détachée à la session.
Le code est désormais le suivant:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
|
public ArrayList<GalleryDAO> findGalleriesForMember(MemberDAO memberDAO) {
// Result list
ArrayList<GalleryDAO> galleryAL = null;
try {
Session session = HibernateHelper.currentSession();
session.lock(memberDAO.getAccess(), LockMode.NONE);
// Query creation
Query query = session
.createQuery("from GalleryDAO as galleryDAO inner join galleryDAO.groupL as groupDAO where groupDAO in (:groupList)");
// Query parameter
query.setParameterList("groupList", memberDAO.getAccess()
.getGroups());
// Getting result list
galleryAL = (ArrayList<GalleryDAO>) query.list();
} catch (Exception e) {
logger.logError("Erreur de requête", e);
} finally {
HibernateHelper.closeSession();
}
return galleryAL;
} |
Ma seconde question est la suivante:
- Pourquoi dois je rattacher l'objet "accessDAO" et non pas le "membreDAO" directement?? En effet, l'instruction suivante ne fonctionne pas
Code:
1 2
|
session.lock(memberDAO, LockMode.NONE); |
Si quelqu'un peut m'éclairer :wink: