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 :

EJB entity bean et LazyInitializationException


Sujet :

JPA Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Février 2008
    Messages
    222
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 222
    Par défaut EJB entity bean et LazyInitializationException
    Bonsoir,

    Voila mon problème, je travail avec ejb 3 et j'arrive à ajouter des nouveaux enregistrements dans ma base de données, par contre lorsque je voulais supprimer un enregistrement dans ma table j'avais un LazyInitialisationException, aprés quelques recherches sur le net, j'ai trouvé et voila le code qui permet de supprimer

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    public void supprimerDocument(Document document) {
    		em.remove(em.find(Document.class, document.getId()));
     
    	}
    En fait, avant je mettais juste em.remove(document), et j'avais l'erreur cité ci-dessus

    Maintenant, mon problème est : lorsque je veux faire une requête de type SELECT, j'ai de nouveau cette erreur :

    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
     
    type Rapport d'exception
     
    message
     
    description Le serveur a rencontré une erreur interne () qui l'a empêché de satisfaire la requête.
     
    exception
     
    org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: ejb.TypeDocument.document, no session or session was closed
    	org.hibernate.collection.AbstractPersistentCollection.throwLazyInitializationException(AbstractPersistentCollection.java:358)
    	org.hibernate.collection.AbstractPersistentCollection.throwLazyInitializationExceptionIfNotConnected(AbstractPersistentCollection.java:350)
    	org.hibernate.collection.AbstractPersistentCollection.initialize(AbstractPersistentCollection.java:343)
    	org.hibernate.collection.PersistentSet.add(PersistentSet.java:189)
    	servlet.AjouterDocument.doGet(AjouterDocument.java:142)
    	javax.servlet.http.HttpServlet.service(HttpServlet.java:690)
    	javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
    	org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:96)
    Et la je ne peux pas mettre un find

    Savez vous comment peut on corriger ce problème ?

    Merci

  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,
    Dans quel environnement tu travailles ? Une applciation web ou application Java ordinaire avec un main ?
    Sinon, Ton problème vient possiblement du fait que soit :
    - Tu n'ouvres pas une session Hibernate avant de faire le select ...
    - Les objets du select ont une relation avec d'autres objets. Tu ouvres une session, tu récupères ces objets, tu fermes la session. Quand tu essaies ensuite d'accéder aux objets référencés, kaboum !

    La solution dépend de l'environnement (cf ma première question). Mais en gros, il s'agit de garder la session ouverte le plus longtemps possible, et non pas l'ouvrir pour cahque opération (select, insert, etc.). Mais ce sera pas très clean comme solution.

    Optimalement, tu devrais te tourner vers un conteneur comme Spring (ou encore CMP avec un serveur d'application) qui permet de gérer cela, mais ça introduit un peu de complexité à la tache, auquel cas il faudrait lire attentivement quelques documents sur cette histoire de Lazy Fetch Exception: c'est un grand classique

  3. #3
    Membre éclairé
    Inscrit en
    Février 2008
    Messages
    222
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 222
    Par défaut
    Salut,

    Mon envirronement de travail est une application web (applet - servelt) et j'utilise des ejb3.
    Ce que je n'arrive pas à comprendre, c'est le fait d'ouvrir une session avec hibernate, c'est pas ejb3 qu'il le gère normalement, à première vu non, mais alors comment ouvre - t - on une session hibernate dans des ejb3 ?

    Il parle de session.lock, mais ce n'est pas trés clair, je n'arrive pas à le mettre en application

  4. #4
    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,
    Il y'a deux solution dans ce cas-ci:
    - Solution à la bourrine: Tu crées un filtre associé à ta Servlet qui ouvre la session d'Hibernate, passe la main à la Servlet, et à son retour, ferme la sesion. C'est pas très propre mais ça fonctionne et c'est simple à mettre en place.
    - Solution propre: utiliser Spring pour la gestion de l'EntityManager. Là, la complexité augmente un petit peu, mais les avantages qu'on y gagne valent largement le coup.

  5. #5
    Membre éclairé
    Inscrit en
    Février 2008
    Messages
    222
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 222
    Par défaut
    Merci, je vais regarder la deuxième solution,mais le problème c'est que je ne connais pas du tout spring, mais bon, si c'est la solution la plus propre, on va tester.

    Si tu as un exemple je suis preneur

  6. #6
    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
    J'ai justement sur ma TODO List la rédaction d'un article sur ça (avec JSF, mais bon, l'esprit est le même), mais ça risque de prendre du temps.

    Je peux entre temps rédiger en vitesse un billet sur mon blog sur comment mettre ça en place. Je vais voir ce que je peux faire

    Courageuse et bonne décision au fait

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 21/06/2012, 13h00
  2. [EJB3 Entity] Entity Bean et LazyInitializationException
    Par bard123 dans le forum Java EE
    Réponses: 1
    Dernier message: 13/03/2008, 17h15
  3. EJB Entity Bean et problème de mapping
    Par bard123 dans le forum JPA
    Réponses: 13
    Dernier message: 07/03/2008, 08h54
  4. EJB Entity Bean
    Par bard123 dans le forum JPA
    Réponses: 10
    Dernier message: 04/03/2008, 12h36
  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