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 :

Problème Lazy Loading Dans une Application java (SE) autonome


Sujet :

Hibernate Java

  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2013
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2013
    Messages : 47
    Points : 40
    Points
    40
    Par défaut Problème Lazy Loading Dans une Application java (SE) autonome
    Bonsoir :

    Je suis entrain de développer une application java divisé en 3 couches ( DAO , Service , IHM ) , pour la partie DAO j'utilise Hibernate 3 pour la persistance des données , Les transactions sont gérés dans la couche service , pour IHM j'utilise swing ( c'est une application autonome)

    Le problème que j'ai rencontré " lazy loading " ,Pour remédier a se problème j'ai trouvé pas mal de solution sur Internet. Mais ça marche pas

    j'ai besoin d'autre solution sachant que je suis obligé d'utilisé le lazy loading et la partie IHM est géré par swing .

  2. #2
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Et quel est le problème, concrètement? C'est vague "j'ai un problème de lazy loading". Tout ce que je peux te répondre en l'état c'est "c'est parce que tu as fermé trop tôt ta session hibernate".

  3. #3
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2013
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2013
    Messages : 47
    Points : 40
    Points
    40
    Par défaut
    lorsque je charge un objet de la base de données (objet persistant ) , par exemple un objet Etudiant ( nom , prenom , list<matiere>) au niveau des deux premiers attribut nom prenom y a pas de problème mais pour la liste des matières lorsque j'appel la méthode getMatiere() : list : E.getMatiere()

    sachant que j'ai pas encore fermé la session ( objet persistant) je récupère aucun résultat le retour est encore vide mais si j'appel une methode comme E.getMatiere().size() .... ou List maList = new arrayList( E.getMatiere()) je récupère la liste des absences

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 57
    Points : 41
    Points
    41
    Par défaut
    Salut,

    j'ai exactement le même soucis que toi, j'utilise un session.get(Nomdelaclasse, id) et lors de la récupération de mon set d'objets via mon instance j'obtiens une liste vide. Mon code est disponible dans un post que j'ai publié il y a environ deux jours sur le forum.

  5. #5
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Tu peux nous montre un code qui reproduit ton problème et sa sortie. Comment sais-tu que le Set est vide? Tu itère dessus?

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 57
    Points : 41
    Points
    41
    Par défaut
    en fait le code est sur ce post : http://www.developpez.net/forums/d14...s-session-get/

  7. #7
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Citation Envoyé par fats1 Voir le message
    Heu, c'est à ridazero que je parle, pas à toi.

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 57
    Points : 41
    Points
    41
    Par défaut
    ah ok désolé lol

  9. #9
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2013
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2013
    Messages : 47
    Points : 40
    Points
    40
    Par défaut voici le code
    Premier méthode au niveay de la couche DAO (etudiantDao)
    public List<Absence> getAbsence(Long id)
    {
    List<Absence> list=null;//=new ArrayList<Absence>();
    Etudiant o=null;
    Session s = getSession();
    if (!s.getTransaction().isActive()) {
    LOGGER.debug("Il n y a pas de transaction active, le DAO utilise son propre transaction");
    Transaction tx = null;
    tx = s.beginTransaction();
    try {
    o=findById(id);
    } catch (EntityNotFoundException e) {

    }
    // soit cette solution ou list.addAll(o.getAbsences());
    /* deuxième solution */o.getAbsences().size();
    list = o.getAbsences();
    tx.commit();
    if (s != null && s.isOpen())
    s.close();
    }
    return list;
    }
    2 emme méthode au niveau de la couche service
    public List<Absence> getAbsenceOfStudent(long id) {

    return dao.getAbsence(Long.valueOf(id));
    }

    // couche ihm appel de la methode getAbsenceOfStudent

  10. #10
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2013
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2013
    Messages : 47
    Points : 40
    Points
    40
    Par défaut
    l'instruction tt seule list = o.getAbsences();
    ne récupère aucun résultat , mais si j'appel .size() o je force la copie à ce moment la la requete s'execute et charge les données en memoir

  11. #11
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    list = o.getAbsences();
    tx.commit();
    if (s != null && s.isOpen())
    s.close();
    }
    Dans ce code, après avoir récupéré l'étudiant, et la collection absence, tu ferme la session. Hors, si ta collection est en lazyloading, elle n'est pas encore chargée, elle ne le sera que quand tu ira voir ce qui se trouve dans cette collection. Si tu fais du lazyloading, il ne faut pas fermer ta session tant que tu n'a pas fini d'utiliser tes objets. C'est donc un erreru de fermer ta session.

    L'utilisation de size n'est qu'un effet de bord, pour avoir la taille, il faut charger la liste, donc aller au dela du lazy loading. Ca va marcher à un niveau, celui de ta liste. Ca ne résoudra pas les lazy loading dans les Absence même.

    Donc deux solutions possibles:
    1. ne pas faire de lazy loading
    2. ne pas fermer ta session


    A noter que dans ton code, ça ne va pas rien retourner. Du fait que tu as fermé ta session, tout appel à la liste par la suite déclenchera des LazyLoadingException. C'est bien différent d'une liste vide!!!

  12. #12
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2013
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2013
    Messages : 47
    Points : 40
    Points
    40
    Par défaut
    si j'appel juste " list = o.getAbsences();" j’obtiendra pas d'erreur de lazy mais une collection vide main si j'utilise size ou je force la copie de la collection pour la retourné " list = new ArrayList(o.getAbsence());" j’obtiendra une collection avec les résultats que je veux .(meme si en dehors de la session parce que j'ai forcé la copie )

    Un autre exemple


    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 List<Absence> getAbsence(Long id)
    	{
    		List<Absence> list=null;//=new ArrayList<Absence>();
    		Etudiant o=null;
    		Session s = getSession();
    	 if (!s.getTransaction().isActive()) {
     LOGGER.debug("Il n y a pas de transaction active, le DAO utilise son propre transaction");
    					Transaction tx = null;
    						tx = s.beginTransaction();
    						try {
    							o=findById(id);
    						} catch (EntityNotFoundException e) {
     
    						}
     
     
    						list = o.getAbsences();
     
                                                   if( list == null ) sysout( " la liste est null " ) ;
     
     
    						tx.commit();
    						if (s != null && s.isOpen())
    							s.close();
    				}
    			return list;
    	}
    j'obtiens le message" la liste est nul " , Mais si j'ajout juste list.size() avant l'affichage : ou je force la copie j'obtiens le résultat souhaité ( la liste des absence )

    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 List<Absence> getAbsence(Long id)
    	{
    		List<Absence> list=null;//=new ArrayList<Absence>();
    		Etudiant o=null;
    		Session s = getSession();
    	 if (!s.getTransaction().isActive()) {
     LOGGER.debug("Il n y a pas de transaction active, le DAO utilise son propre transaction");
    					Transaction tx = null;
    						tx = s.beginTransaction();
    						try {
    							o=findById(id);
    						} catch (EntityNotFoundException e) {
     
    						}
     
     
    						list = o.getAbsences();   list.sier(); 
                                                    // lits = new ArrayList(o.getAbsences());
                                                   if( list == null ) sysout( " la liste est null " ) ;
     
     
    						tx.commit();
    						if (s != null && s.isOpen())
    							s.close();
    				}
    			return list;
    	}
    ce que je voulais savoir c'est même si la session est ouvert , cette instruction O.getAbsence() ne fait aucun chargement ! pourquoi , il me faut soit forcer la copie ou effectuer une operation sur la collection ( isempty , .......;;; )

  13. #13
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    j'obtiens le message" la liste est nul " , Mais si j'ajout juste list.size() avant l'affichage : ou je force la copie j'obtiens le résultat souhaité ( la liste des absence )
    Ca n'a pas de sens ce que tu dit. Si list est null, list.size() déclenchera un NullPointerException. Après y a du code dans tous les sens. Met nous non pas les bidouille que tu fais, mais le code concrètement qui t'amène à conclure que la liste est vide! Parce que si tu traite partout tes exception comme ce que j'ai vu, avec des catch vide, les exception Lazy tu risque pas de les voir passer.

  14. #14
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2013
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2013
    Messages : 47
    Points : 40
    Points
    40
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    list = o.getAbsences();
     
    for ( Absence Abs : list)
    {
    sysout(abs.getDate());
    }
    tx.commit();
    if (s != null && s.isOpen())
    s.close();
    }
    ce code n'affiche rien sachant que je suis dans la session ( session ouvert ) et il y a des absences dans la base de données pour l'objet o , mais ce lui la affiche les absences

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    list = o.getAbsences();
     
    list.size(); // ou list = new ArrayList( o.getAbsences());
    for ( Absence Abs : list)
    {
    sysout(abs.getDate());
    }
    tx.commit();
    if (s != null && s.isOpen())
    s.close();
    }
    // affiche les absences
    Pouvez vous m'expliquer ?

  15. #15
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Donne nous plus de contexte, parce que dans l'absolu, il ne devrait pas y avoir de différence...

Discussions similaires

  1. drag & drop de fichiers dans une application java
    Par devmat dans le forum Interfaces Graphiques en Java
    Réponses: 4
    Dernier message: 13/12/2007, 00h41
  2. Utiliser ssh dans une application java
    Par Samanta dans le forum Sécurité
    Réponses: 12
    Dernier message: 28/02/2007, 16h30
  3. Comment intégré Firefox dans une application JAVA ?
    Par laurent_h dans le forum Interfaces Graphiques en Java
    Réponses: 4
    Dernier message: 07/06/2006, 17h57
  4. Ouvrir un document word dans une application java
    Par serialkilled dans le forum API standards et tierces
    Réponses: 14
    Dernier message: 02/06/2006, 18h48
  5. [débutante]Intégrer flash dans une application java
    Par bouba83 dans le forum Interfaces Graphiques en Java
    Réponses: 6
    Dernier message: 11/05/2006, 11h11

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