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

Développement Web en Java Discussion :

lazy loading entity bean


Sujet :

Développement Web en Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 18
    Par défaut lazy loading entity bean
    bonjour,

    je rencontre l’exception suivante :
    javax.servlet.ServletException: failed to lazily initialize a collection of role: com.yaps.petstore.entity.catalog.Category.products, no session or session was closed
    pour vous expliquez un peu
    j’ai une deux classe entity : « category » et « product . »

    L’entity « category » a une liste de « product ».

    Dans mon ejb session j’ai defini la methode:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    public List<Product> findProductsByCategory(Category category) {
            category =em.merge(category);
            List <Product> l=new ArrayList<Product>();
                             l=cat.getProducts();
                             //l.size();
                             return l;
        }
    Au moment d’afficher la liste des produits, il me lance l’execption…

    Par contre si je rajoute la ligne l.size() (mis en commentaire)
    La liste de produit s’affiche correctement sans exception.

    Si quelqu’un a une reponse…

    Merci.

  2. #2
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 313
    Billets dans le blog
    1
    Par défaut
    Et bien, quand tu fais l = cat.getProducts(), tu assignes l'adresse de la liste de cat à l.
    Comme la liste est en lazy="true", elle n'est pas encore chargée.
    Le fait de faire size() suffit à lancer la requête de chargement.
    L'erreur lazy loading vient du fait qu'au moment où tu veux traiter les données, l'objet est "détaché" (session fermée) et donc toutes les données en lazy loading sont inaccessibles.
    Il suffirait de fermer la session une fois la page rendue (à moins que tu ne sois dans un contexte EJB, auquel cas, c'est un peu plus compliqué et il faudra (peut-être) passer par des DTO)

    C'est plus clair ?
    A+
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 18
    Par défaut
    merci pour ta reponse,

    je comprend mieux, je trouve sa un peu lourd de devoir faire un l.size()...

    Pour ce qui est de laisser la session ouverte , je ne voit pas trop comment faire...

    je t'explique rapidement mon architecture

    jsf--->classe controller--->EJb session--->entity bean.

    je remarque que des qu'un entity bean arrive au niveau du controller, il est detaché et donc me lance un exception lazy...
    Tu pense qu'on peut laisser la session ouverte entre le controller et l'ejb??

  4. #4
    Membre averti
    Inscrit en
    Novembre 2008
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 22
    Par défaut
    Au lieu de se concentrer sur comment laisser la session ouverte (Chose qu'il faut pas faire). Tu peux plutôt essayer de rendre ton objet persistant (load(), save(), get()....)

  5. #5
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 313
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par mechbab Voir le message
    Au lieu de se concentrer sur comment laisser la session ouverte (Chose qu'il faut pas faire). Tu peux plutôt essayer de rendre ton objet persistant (load(), save(), get()....)
    C'est pas le problème...

    Citation Envoyé par roronnoa Voir le message
    merci pour ta reponse,

    je comprend mieux, je trouve sa un peu lourd de devoir faire un l.size()...

    Pour ce qui est de laisser la session ouverte , je ne voit pas trop comment faire...

    je t'explique rapidement mon architecture

    jsf--->classe controller--->EJb session--->entity bean.

    je remarque que des qu'un entity bean arrive au niveau du controller, il est detaché et donc me lance un exception lazy...
    Tu pense qu'on peut laisser la session ouverte entre le controller et l'ejb??
    Dans une architecture de ce type, je dirais que tu n'as que 2 possibilités :

    1- passer par des DTO
    2- utiliser Seam

    Dans le cas 1, tu contournes le problème en chargeant des objets dédiés à l'ihm dans la couche EJB Session (donc dans le conteneur d'EJB). Du coup, tes EJB Session revoient des objets POJOs vers la couche JSF - Controler.
    C'est un peu lourd, mais il y a des avantages également (comme une plus grande indépendance entre le modèle de données et la couche présentation)

    Dans le cas 2, Seam bosse pour toi et permet de garder "ouvert" le contexte EJB jusqu'à la fin de la phase de rendu (et là, tu n'auras plus de problème de lazy loading). Maintenant, je n'ai pas assez de recul ni d'expériences pour dire s'il y a des limites à cette techno, je ne sais pas trop comment ça fonctionnerait dans le cadre de serveurs d'EJB répartis...

    Rien ne t'empêche de voir sur le site de JBoss

    A+
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 18
    Par défaut
    j'ai regardé du coté de seam...
    Et justement je trouve qu'il gére beaucoup de chose qui reste transparentes pour le devellopeur.
    Je vait rester sur la premiére approche.

    merci encore +

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

Discussions similaires

  1. Lazy loading et fermeture de session hibernate
    Par BRAUKRIS dans le forum Hibernate
    Réponses: 3
    Dernier message: 20/07/2006, 13h08
  2. [hibernate] problème pour desactiver le lazy loading
    Par agougeon dans le forum Hibernate
    Réponses: 2
    Dernier message: 14/03/2006, 11h20
  3. [HIBERNATE 3]Lazy loading
    Par SEMPERE Benjamin dans le forum Hibernate
    Réponses: 11
    Dernier message: 08/02/2006, 22h40
  4. [Jonas] Impossible de déployer une Entity Bean CMP2
    Par blockparty dans le forum JOnAS
    Réponses: 2
    Dernier message: 01/12/2005, 15h45
  5. [ Entity bean ] CMP
    Par hocinema dans le forum Websphere
    Réponses: 5
    Dernier message: 03/10/2003, 11h33

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