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 : 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;
    }
j'ai cette exception qui est levée:
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
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : 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;
    }
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 : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
 
session.lock(memberDAO, LockMode.NONE);
Si quelqu'un peut m'éclairer