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 :

JSF - JPA - HQL : failed to lazily initialize a collection of role


Sujet :

Hibernate Java

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 4
    Points : 2
    Points
    2
    Par défaut JSF - JPA - HQL : failed to lazily initialize a collection of role
    Bonjour à tous,

    Voilà j'ai un petit problème avec Hibernate en mode LAZY. Je vous explique sur un exemple plus simple que mon projet actuel (mais l'erreur est aussi présente dans cet exemple, je l'ai testé :p) :

    Je crée un application JavaWeb (je suis sous NetBeans 6.7.1) avec le framework Java Server Faces.
    J'ai un bdd avec deux tables : une voiture et une marque. Il y a bien sûr une foreign key qui va de marque dans voiture à idmarque dans marque.

    Je fais : Create Entity Classes from Database. Là je choisi ma connection préalablement créé, je crée ma PU en mettant Hibernate et puis ca me fait mes classes.
    Ensuite je fais : Create JSF Pages from Entity Classes.

    Et ca marque bien... Sauf quand je fais un Show ou un Edit dans marque. En fait il a un problème avec la clé etrangère (le JOIN) pour créer la collection de voiture...

    Voici mon erreur :

    exception

    javax.servlet.ServletException: failed to lazily initialize a collection of role: Entity.Marque.voitureCollection, no session or session was closed

    root cause

    org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: Entity.Marque.voitureCollection, no session or session was closed
    Pour voiture j'ai :
    @JoinColumn(name = "marque", referencedColumnName = "idmarque")
    @ManyToOne(optional = false)
    private Marque marque;
    Pour marque j'ai :
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "marque")
    private Collection<Voiture> voitureCollection;
    Avez vous une idée de la source du problème ?! J'ai cherché toute la journée hier en essayant de jouer sur la requête (en utilisant le LEFT JOIN ou les différent fetch) mais rien a faire...

    Merci d'avance !

  2. #2
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 8
    Points : 10
    Points
    10
    Par défaut
    Bonjour,

    Je crois qu'il te faut soit :

    - Modifier les paramètres de ton lazy dans ton hbm.
    - Soit forcer l'accès à ta collection (par un simple appel à son getter) depuis ton backend avant l'affichage.

    L'erreur vient du fait que dans le contexte où tu affiches ta collection, hibernate n'a plus de contexte session pour faire les accès bases et mettre à jour celle-ci.

    - Tu peux également refaire un appel backend pour mettre à jour ta collection en faisant un simple appel à son getter si tu es dans un cas spécifique de traitement ...

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    Bonjour et merci de ta réponse,

    Modifier les paramètres du LAZY n'est pas une solution (optimisation oblige).

    Qu'appel tu
    - Soit forcer l'accès à ta collection (par un simple appel à son getter) depuis ton backend avant l'affichage.
    ?

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 8
    Points : 10
    Points
    10
    Par défaut
    Dans la méthode de chargement de Marque faire un simple getVoitureCollection() pour forcer son alimentation par hibernate ou plus exactement, l'instruction à l'origine de cette erreur doit être exécutée dans un contexte ou hibernate possède une session.

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    public Marque() {
    this.getVoitureCollection();
    }
    Toujours la même erreur

    Je vous met aussi les query de la class Marque :

    @Entity
    @Table(name = "marque", catalog = "javaee", schema = "")
    @NamedQueries({@NamedQuery(name = "Marque.findAll", query = "SELECT m FROM Marque m"), @NamedQuery(name = "Marque.findByIdmarque", query = "SELECT m FROM Marque m WHERE m.idmarque = :idmarque"), @NamedQuery(name = "Marque.findByLibmarque", query = "SELECT m FROM Marque m WHERE m.libmarque = :libmarque")})

  6. #6
    Membre chevronné
    Inscrit en
    Août 2009
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 1 073
    Points : 1 806
    Points
    1 806
    Par défaut
    L'appel au getter doit être fait quand ta session est encore ouverte, ie dès que tu charges l'objet !

Discussions similaires

  1. Réponses: 2
    Dernier message: 18/01/2015, 19h05
  2. Réponses: 10
    Dernier message: 07/03/2014, 16h18
  3. Failed to lazily initialize a collection
    Par Grumium dans le forum Hibernate
    Réponses: 8
    Dernier message: 27/10/2009, 16h35
  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