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):
j'ai cette exception qui est levée:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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; }
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...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
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:
tout rentre dans l'ordre. Cette instruction à pour but de rattacher une instance détachée à la session.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 session.lock(memberDAO.getAccess(), LockMode.NONE);
Le code est désormais le suivant:
Ma seconde question est la suivante:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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; }
- Pourquoi dois je rattacher l'objet "accessDAO" et non pas le "membreDAO" directement?? En effet, l'instruction suivante ne fonctionne pas
Si quelqu'un peut m'éclairer
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 session.lock(memberDAO, LockMode.NONE);![]()
Partager