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 :

LazyInitializationException : failed to lazily ..


Sujet :

JPA Java

  1. #1
    Membre expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Points : 3 080
    Points
    3 080
    Par défaut LazyInitializationException : failed to lazily ..
    Salut,

    Je souhaiterais avoir un objet qui n'est pas un EJB, de type Cart (caddie), qui contient une liste de Product (ejb) et qui est contenu dans un User.

    Pour cela, j'ai déclaré Cart comme @Embeddable, et dans l'attribut Cart de User j'ai mis @Embedded. Jusque là, tout va bien.
    Le problème, c'est que quand je récupère le Cart à partir du User, la liste des Product n'est pas chargée, et j'obtiens l'erreur suivante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    LazyInitializationException: failed to lazily initialize a collection of role: ejb.User.cart.products, no session or session was closed
    Je ne sais pas comment résoudre le problème, apparemment un problème de session, mais bon je récupère mon User dans la servlet, et je fais un getProductsInCart() directement (ou alors un getCart().getProducts()), et ça me lance cette exception.

    Voici le début de la classe Cart:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    @Embeddable
    public class Cart implements Serializable {
     
        private static final long serialVersionUID = 1L;
     
        @OneToMany
        private List<Product> products;
     
        public Cart() {
            products = new ArrayList<Product>();
        }
        ...
    }
    Une idée?

  2. #2
    Membre expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Points : 3 080
    Points
    3 080
    Par défaut
    Je pense que ça devrait résoudre le problème, mais ayant une autre erreur actuellement, je ne suis pas sûr que ça fonctionne, je mettrai résolu si cela marche

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    @OneToMany(fetch=FetchType.EAGER)
    Si qqn a mieux à proposer, je suis preneur

  3. #3
    Membre habitué Avatar de xv-mnt
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    142
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juillet 2005
    Messages : 142
    Points : 178
    Points
    178
    Par défaut
    Le fetch=eager va effectivement marcher, mais il faut savoir que tu vas systématiquement récupérer la liste, même si tu n'en n'as pas besoin.
    Après, tout est une question d'optimisation.

    Perso, je ne l'utilise que rarement. Lorsque j'ai besoin de la liste je fais un dans ma transaction, ce qui permet de retriever le contenu de ma liste.
    Tout le monde savait que c'était impossible à faire. Puis un jour quelqu'un est arrivé qui ne le savait pas, et il le fit (Winston Churchill)

  4. #4
    Membre expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Points : 3 080
    Points
    3 080
    Par défaut
    Citation Envoyé par xv-mnt
    Le fetch=eager va effectivement marcher, mais il faut savoir que tu vas systématiquement récupérer la liste, même si tu n'en n'as pas besoin.
    Après, tout est une question d'optimisation.

    Perso, je ne l'utilise que rarement. Lorsque j'ai besoin de la liste je fais un dans ma transaction, ce qui permet de retriever le contenu de ma liste.
    Pourquoi le .size() permet de retriever le contenu de la liste?

  5. #5
    Membre habitué Avatar de xv-mnt
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    142
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juillet 2005
    Messages : 142
    Points : 178
    Points
    178
    Par défaut
    oui, mais il faut le faire dans ta transaction, et non hors transaction car alors ton objet serait détaché et tu aurais une LazyLoadingException.
    Tout le monde savait que c'était impossible à faire. Puis un jour quelqu'un est arrivé qui ne le savait pas, et il le fit (Winston Churchill)

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    79
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2003
    Messages : 79
    Points : 89
    Points
    89
    Par défaut
    @ rom : le .size() permet non pas de faire le retrieve mais bien de charger ta liste, pour le retrive c'est par ce qu'il le place dans une transaction.

  7. #7
    Membre expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Points : 3 080
    Points
    3 080
    Par défaut
    Je le fais dans une méthode d'une session facade... il faut en plus gérer une transaction?

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    94
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 94
    Points : 102
    Points
    102
    Par défaut
    Sur ton serveur d'application tu es dans une transaction.
    Ce qu'ils veulent dire c'est que le myListe.size(); doit être fait coté serveur d'application pas coté client sinon tu vas avoir une erreur.

    Si tu mets ton FetchType à Eager tu vas toujours récupérer la liste, alors que tu peux laisser en lazy et charger quand tu en as besoin, par exemple dans ton facade :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    getCartWithoutProducts(){
        return cart;
    }
     
    getCartWithProducts(){
        cart.products.size();
        return cart;
    }

Discussions similaires

  1. Réponses: 1
    Dernier message: 03/03/2014, 13h10
  2. Failed to lazily initialize a collection
    Par Grumium dans le forum Hibernate
    Réponses: 8
    Dernier message: 27/10/2009, 16h35
  3. Réponses: 5
    Dernier message: 23/10/2009, 14h02
  4. failed to lazily initialize a collection of role ?
    Par zuzuu dans le forum Hibernate
    Réponses: 3
    Dernier message: 25/02/2009, 16h02
  5. Réponses: 1
    Dernier message: 04/04/2007, 09h17

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