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

JPA Java Discussion :

probleme lazy Exception


Sujet :

JPA Java

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    231
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 231
    Par défaut probleme lazy Exception
    BOnjour
    je développe sous Netbeans +glassfish+hibernate+mysql

    J'ai un entity bean 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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    package fr.hh.com.persistence;
     
    import fr.hh.com.exception.ValidationException;
    import java.util.List;
    import javax.persistence.*;
     
     
    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,id=DCE.D8085F74-D247-A25F-E3A8-5C513049DE80]
    // </editor-fold> 
    /* classe mère */
    @MappedSuperclass
    public class Clients extends PersonneMorale implements java.io.Serializable{
     
     
        // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
        // #[regen=yes,id=DCE.642A4BBF-0209-636E-154F-D9C9B678436E]
        // </editor-fold> 
        @Column(name="codeClient")
        private int codeClient=0;
     
        @OneToMany(cascade=CascadeType.ALL)
        private List<Interlocuteurs> interlocuteurs;
     
        /********************************
         *******Constructor*************
         ********************************/
        public Clients(){super();}
        public Clients(int codeClient){
            super();
            setCodeClient(codeClient);
        }
        /********************************
         *******Methode de verification***
         ********************************/
        @PrePersist
        @PreUpdate
        private void validateData() {
            if (codeClient == 0 )
                throw new ValidationException("Code Client invalide");
        }
     
     
         /********************************
         *******GETTER and SETTER********
         ********************************/
        public int getCodeClient() {
            return codeClient;
        }
     
        public void setCodeClient(int codeClient) {
            this.codeClient = codeClient;
        }
    public List<Interlocuteurs> getInterlocuteurs() {
            return (List)interlocuteurs;
        }
     
        public void setInterlocuteurs(List<Interlocuteurs> interlocuteurs) {
            this.interlocuteurs =  interlocuteurs;
        }
     
    }
    La classe fille qui en hérite
    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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    package fr.hh.com.persistence;
     
    import fr.hh.com.exception.ValidationException;
    import javax.persistence.*;
     
     
    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,id=DCE.279A094E-70B6-3A58-BFF5-DA771E823FD4]
    // </editor-fold> 
    @Entity
    @Table(name="interlocuteurs")
    public class Interlocuteurs   extends PersonnePhysique implements java.io.Serializable{
     
        @Column(name="rem")
        private String rem;
     
     
     
         /********************************
         *******Constructor*************
         ********************************/
        public Interlocuteurs()  {
    		super();
    	}
     
     
         /********************************
         *******Methode de verification***
         ********************************/
        @PrePersist
        @PreUpdate
        private void validateData() {
            if (getNom() == null || "".equals(getNom()))
                throw new ValidationException("Nom  invalide");
     
     
        }
        /********************************
         *******GETTER and SETTER********
         ********************************/
          public String getRem() {
            return rem;
        }
     
        public void setRem(String rem) {
            this.rem = rem;
        }
     
     
    }
    La classe clients possède une liste d'interlocuteurs avec une annotation OneToMany.

    Dans mon Bean, j'essai de lister les préleveurs par la méthode suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
         public ArrayList<Preleveur> listePreleveur(){
              /*on liste les preleveurs*/
             List<Preleveur> liste;
     
             liste=em.createQuery("Select c from Preleveur c").getResultList();
     
             return (ArrayList<Preleveur>) liste;
         }
    Ca marche bien si je veux accéder au champs normaux. Par contre si je veux accéder à l'attribut getInterlocuteurs qui doit me retourner une Arraylist de type Interlocuteurs, j'obtiens une erreur.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    GRAVE: failed to lazily initialize a collection of role: fr.hh.com.persistence.Preleveur.interlocuteurs, no session or session was closed
    org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: fr.hh.com.persistence.Preleveur.interlocuteurs, no session or session was closed
    Je pense que c'est du à un probleme de rattachement à mon entitymanager.
    Mais je ne vois pas comment faire pour résoudre ce probleme. j'ai essaye de regarder , on parle bien de size() , mais je ne sais pas où le mettre .

    Auriez vous une idée pour me dépanner?

    Merci d'avance.

  2. #2
    Expert confirmé
    Avatar de djo.mos
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    4 666
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 4 666
    Par défaut
    Bonjour,
    - Solution crade 1:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    public ArrayList<Preleveur> listePreleveur(){
              /*on liste les preleveurs*/
             List<Preleveur> liste;
     
             ArrayList<Preleveur>=em.createQuery("Select c from Preleveur c").getResultList();
             for(Preleveur p : liste){
               p.getInterlocuteurs().size();
             }
             return  liste;
         }
    - Solution crade 2: désactiver le Lazy Fetch:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     @OneToMany(cascade=CascadeType.ALL, fetch=FetchType.EAGER)
        private List<Interlocuteurs> interlocuteurs;
    - Solution propre : garder la session de persistence ouverte jusqu'à ce que le rendu de l'IHM soit terminée.
    Il nous faut plus de détails sur ton aplication: quel type ? JSE ou JEE ? Si JEE quel framework web ? etc.

  3. #3
    Membre Expert
    Profil pro
    Inscrit en
    Août 2006
    Messages
    3 274
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 3 274
    Par défaut
    Je suis peut-être à côté de la plaque, mais un petit fetch join dans la requête n'est-il pas possible en JPA ?

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    231
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 231
    Par défaut
    Désactiver le lazy me pose problème. J'ai fais une solution cradre pour l instant.

    Sinon c 'est une appli client riche J2EE reposant sur des ejb 3.0.

  5. #5
    Expert confirmé
    Avatar de djo.mos
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    4 666
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 4 666
    Par défaut
    Ok.
    Ton entityManager est bien géré et injecté par le conteneur, n'est ce pas ?
    Ou est ce que tu le crées à la main ?

  6. #6
    Membre Expert
    Profil pro
    Inscrit en
    Août 2006
    Messages
    3 274
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 3 274
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Select c from Preleveur c left join fetch c.interlocuteurs
    (ou inner join fetch selon ce que tu veux)

    Non ?

Discussions similaires

  1. Probleme d' exception Hibernate
    Par Canard64 dans le forum Hibernate
    Réponses: 2
    Dernier message: 22/07/2008, 21h42
  2. Probleme lazy loading JPA TopLink
    Par willoi dans le forum JPA
    Réponses: 6
    Dernier message: 17/06/2008, 12h04
  3. Probleme d exception
    Par L4BiN dans le forum API standards et tierces
    Réponses: 2
    Dernier message: 05/10/2007, 20h58
  4. Probleme d'exception : java.net.UnknownHostException
    Par kedare dans le forum Entrée/Sortie
    Réponses: 1
    Dernier message: 08/06/2006, 20h59
  5. probleme d'exception sur du void
    Par lkryss dans le forum Langage
    Réponses: 3
    Dernier message: 08/06/2006, 17h45

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