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 :

fonctionnement de l'attribut lazy


Sujet :

Hibernate Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Juin 2006
    Messages
    65
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 65
    Par défaut fonctionnement de l'attribut lazy
    Bonjour,

    J'ai un fichier de mapping pour l'objet Procedure dans lequel je mappe une collection listeMail et je mets l'attribut "lazy" à "true". Donc quand je charge un objet Procedure la collection listeMail n'est pas chargée automatiquement. C'est parfais !

    Du coup quand je fais Procedure.getListeMail() il me provoque une erreur qui est la suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    ERROR [http-8080-Processor25] (LazyInitializationException.java:19) - failed to lazily initialize a collection of role: bean.Procedure.listeMail, no session or session was closed
    org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: bean.Procedure.listeMail, no session or session was closed
    Est ce que quand je fais Procedure.getListeMail(), un simple getteur il essaie de se connecter à la base ???

    J'ai essayer de modifier ma méthode comme ceci :

    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
     
    	/**
             * @return Returns the listeMail.
             */
    	public Set getListeMail() {
    		Session s = null;
    		Set listeMail = null;
    		try{	
    			// Ouverture de la session de connection à la BD
    			s = HibernateUtil.getCurrentSession();	
     
    			return listeMail;
     
    		} catch (HibernateException e) {
    			e.printStackTrace();
    			if (s!= null) s.getTransaction().rollback();
    			oLogger.error("Procedure-getListeMail : Erreur hibernate " + e.getMessage());			
    		}
    		finally{			
    			// Fermeture de la session de connection à la BD
    			HibernateUtil.closeSession();			
    		}	
                    return listeMail;
    	}
    Mais bien sur ca marche pas !

    Auriez vous des suggestions ?

    Merci

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    163
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 163
    Par défaut
    En fait, c'est un problème de contexte ! Ta session est fermée. En fait, ta Procedure appartient a une session, et quand t'essai de récupérer les mails, il a besoin de rattacher les mails à un objet Procedure dans la mêm session. Bref ! On avait rencontré le pb avec Bebert. Tu peux faire tt dans une session. Mettre dans ton mapping, fetch="join" si tu charge tes mails à chaque fois que tu charges tes procedures. sinon, recharge la procedure en attendant, je ne sais plus ce qu'avait utilisé Bebert pr résoudre le pb !

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    163
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 163
    Par défaut
    Tu peux regarder le code de Bebert sur Q pr voir...

  4. #4
    Membre averti
    Inscrit en
    Août 2006
    Messages
    15
    Détails du profil
    Informations personnelles :
    Âge : 47

    Informations forums :
    Inscription : Août 2006
    Messages : 15
    Par défaut
    Pensez à la mise en place de Spring/Hibernate qui permet la réutilisation des sessions hibernate.
    Il existe également des solutions avec du code spécifique qui permet de désactiver la session hibernate et non pas de la fermer complètement. Cela permet de la réutiliser et donc de bénéficier du mode lazy. Code spécifique que l'on peut implémenter dans un "framework maison".

  5. #5
    Membre émérite Avatar de BizuR
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    688
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 688
    Par défaut
    mdr, tu mets un "t" a la fin de Beber

    Cette erreur se situe, comme l'a dit cicolas, au niveau de ta session. Il se trouve que tu as surement détaché l'objet de la session, et, comme tu as demandé à accéder à un attribut affecté par le lazyLoading, Hibernate tente de se connecter pour récupérer les infos en conséquence.

    Deux solutions :
    - Rattachement de l'objet à une nouvelle session (session.attach(object))
    - Chargement (partiel) de la liste, il existe plusieurs stratégies dont notamment le batch (ou fetch, je ne connais plus exactement le nom) qui te permet de ne charger qu'une partie de la liste (de 5 en 5 par exemple)... ce qui te permet ainsi de ne pas aller en base lors de l'accès à ta liste dans un premier temps (enfin je crois ), et de conserver un chargement léger de ton graphe d'objet

    Ce lien pourra t'en dire plus :
    http://www.hibernate.org/hib_docs/v3...-fetching-lazy

  6. #6
    Membre averti
    Inscrit en
    Juin 2006
    Messages
    65
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 65
    Par défaut
    Salut,

    Alors j'ai testé vos solutions mais sans grand succès :

    - quand je laisse ma fonction

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    getListeMail(){ return this.listeMail; }
    *

    et que je mets fetch="join" j'obtiens la même erreur


    - session.attach(objet) : la méthode attach() est inconnu. Il s'agit de la session hibernate n'est ce pas ? car si c'est bien le cas elle n'existe pas


    - j'ai essayé de mettre mon code dans une session comme préconisé sur www.hibernate.org mais ca me dit "session is closed" !


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

Discussions similaires

  1. L'attribut Javadoc {@value} fonctionne-t-il sous Eclipse ?
    Par Shivan dans le forum Eclipse Java
    Réponses: 2
    Dernier message: 19/05/2010, 11h56
  2. Tester le lazy d'un attribut d'objet
    Par Nertios dans le forum Hibernate
    Réponses: 2
    Dernier message: 21/04/2010, 06h33
  3. Réponses: 10
    Dernier message: 05/11/2009, 09h42
  4. Fonctionnement Hibernate en mode Lazy
    Par anisb dans le forum Hibernate
    Réponses: 6
    Dernier message: 09/12/2008, 17h57
  5. Fonctionnement des attributions de droits sur table et bdd ?
    Par shako95 dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 28/11/2005, 13h39

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