IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Hibernate Java Discussion :

[Hibernate 3.0] LazyInitializationException


Sujet :

Hibernate Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre émérite

    Profil pro
    Inscrit en
    Juin 2004
    Messages
    882
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2004
    Messages : 882
    Par défaut [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 : 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

  2. #2
    Membre chevronné
    Inscrit en
    Août 2005
    Messages
    352
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 352
    Par défaut
    Peux tu montrer ton fichier de mapping pour MemberDAO et AccessDAO ?

  3. #3
    Membre chevronné
    Inscrit en
    Août 2005
    Messages
    352
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 352
    Par défaut
    Bon, sans voir tes fichiers de mapping, je me lance dans un diagnostic : http://www.hibernate.org/hib_docs/v3/reference/fr/html_single/#objectstate-transitive

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 7
    Par défaut
    salut

    - 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"??

    --> en fait l'objet que tu passes en paramètre n'est plus en état persistant, et lorsque tu appel une collection mappé avec une initialisation à "lazy=true" sur un objet détaché, ca génère une LazyInitializationException.

    - Pourquoi dois je rattacher l'objet "accessDAO" et non pas le "membreDAO" directement?? En effet, l'instruction suivante ne fonctionne pas

    --> la méthode "session.lock(memberDAO, LockMode.NONE); " ne rattache pas les associations à la session sauf si c'est indiqué spécifiquement dans l'association par la propriété " cascade='lock' ".

    En gros la propriété access n'est pas persisté et la méthode getAccess() retourne simplement la liste que contenait membreDAO (ie surement une liste vide). Comme ta requete indique une contrainte IN sur une liste qui ne contient rien, ca te retourne une liste vide.

  5. #5
    Membre émérite

    Profil pro
    Inscrit en
    Juin 2004
    Messages
    882
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2004
    Messages : 882
    Par défaut
    Merci à vous pour ces réponse, effectivement je n'ai pas eu la présence d'esprit de mettre mes fichiers de mapping, les voici

    Member
    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
     
    <?xml version="1.0"?>
    <!DOCTYPE hibernate-mapping PUBLIC
            "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
            "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
     
    <hibernate-mapping package="com.toto.website.hibernate.pojo.abstraction">
     
        <class name="AbstractPerson" table="SF_WEBSITE_PERSON">
            <id name="id" column="ID">
                <generator class="native"/>
            </id>
            <discriminator column="PERSON_TYPE"/>
            <property name="lastname" column="LASTNAME"/>
            <property name="firstname" column="FIRSTNAME"/>
            <property name="pseudonym" column="PSEUDONYM"/>
            <property name="genre" column="GENRE"/>
            <property name="birthday" column="BIRTHDAY"/>
            <one-to-one name="informations" cascade="persist,delete"/>
            <subclass name="com.toto.website.hibernate.pojo.MemberDAO" discriminator-value="MEMBER_PERSON">
    	        <property name="inscription" column="INSCRIPTION"/>
    	        <one-to-one name="access" cascade="persist,delete" property-ref="member"/>
    		    <bag name="forumMessageL" table="SF_WEBSITE_FORUM_MESSAGE" cascade="persist,delete-orphan">
    		        <key column="ID"/>
    		        <one-to-many class="com.toto.website.hibernate.pojo.ForumMessageDAO"/>
    		    </bag>
            </subclass>
        </class>
     
    </hibernate-mapping>
    access
    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
     
    <?xml version="1.0"?>
    <!DOCTYPE hibernate-mapping PUBLIC
            "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
            "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
     
    <hibernate-mapping package="com.toto.website.hibernate.pojo">
     
        <class name="AccessDAO" table="SF_WEBSITE_ACCESS">
            <id name="login" column="LOGIN"/>
            <property name="password" column="PASSWORD"/>
            <many-to-one name="member" column="MEMBER_ID" unique="true"/>
    	    <set name="groups" table="SF_WEBSITE_ACCESS_GROUP" cascade="persist">
    	        <key column="LOGIN"/>
    	        <many-to-many column="GROUP_NAME" class="com.toto.website.hibernate.pojo.GroupDAO"/>
    	    </set>		        
        </class>
     
    </hibernate-mapping>

  6. #6
    Membre émérite

    Profil pro
    Inscrit en
    Juin 2004
    Messages
    882
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2004
    Messages : 882
    Par défaut
    Le problème est donc résolu merci à vous et merci aussi à jraselin pour tes explications

  7. #7
    Membre éprouvé
    Avatar de geforce
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2010
    Messages
    1 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2010
    Messages : 1 055
    Par défaut
    Hi,
    j'ai le même problème je suis très intéresser par la solution ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: ca.etsmtl.gti525.entity.presentation.Spectacle.representations, no session or session was closed
    Merci

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Framework] Spring/Hibernate et sessions (LazyInitializationException)
    Par stof dans le forum Spring
    Réponses: 4
    Dernier message: 18/02/2014, 15h45
  2. [Hibernate] Exception LazyInitializationException
    Par agougeon dans le forum Hibernate
    Réponses: 2
    Dernier message: 05/10/2007, 20h24
  3. [Data] [Hibernate] LazyInitializationException
    Par youdev dans le forum Spring
    Réponses: 8
    Dernier message: 29/01/2007, 05h48
  4. Réponses: 4
    Dernier message: 22/01/2007, 15h20
  5. Réponses: 5
    Dernier message: 25/05/2005, 21h16

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo