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 :

[ lazy ] many to one


Sujet :

Hibernate Java

  1. #1
    Membre régulier
    Inscrit en
    Juillet 2003
    Messages
    229
    Détails du profil
    Informations forums :
    Inscription : Juillet 2003
    Messages : 229
    Points : 90
    Points
    90
    Par défaut [ lazy ] many to one
    Bonjour,

    J'utilise spring et hibernate, mais j'ai un soucis pour charger une relation entre deux tables:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    00:38:04,706 ERROR LazyInitializationException:<init>:19 - could not initialize proxy - the owning Session was closed
    org.hibernate.LazyInitializationException: could not initialize proxy - the owning Session was closed
    	at org.hibernate.proxy.AbstractLazyInitializer.initialize(AbstractLazyInitializer.java:56)
    	at org.hibernate.proxy.AbstractLazyInitializer.getImplementation(AbstractLazyInitializer.java:98)

    Merci

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    548
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 548
    Points : 635
    Points
    635
    Par défaut
    "the owning Session was closed" tout est là ... Tu as récupéré un objet, fermé la session et ensuite appelé getXXX() sur une relation pas initialisée

  3. #3
    Membre expérimenté Avatar de maxf1
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 229
    Points : 1 371
    Points
    1 371
    Par défaut
    En clair soit tu charges ton fichier via lazy = "false" si tu en as toujours besoin (attention néanmoins au performance si tu as une multitude d'object).

    Si tu peux lorsque tu veux acceder a ton Object faire un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Hibernate.initialize(mon_object);
    Sinon il te faut appeler ton object avant que la session soit close (si tu utilises Spring et que tu le laisse gérer tout seul les sessions ce n'est donc pas possible (ou alors je ne sais pas comment faire)).

  4. #4
    Expert confirmé
    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
    Points : 4 141
    Points
    4 141
    Par défaut
    Je ne vois pas en quoi Spring pose problème dans ce cas.

  5. #5
    Membre régulier
    Inscrit en
    Juillet 2003
    Messages
    229
    Détails du profil
    Informations forums :
    Inscription : Juillet 2003
    Messages : 229
    Points : 90
    Points
    90
    Par défaut
    Oui mais alors comment faire si on utilise Spring?

    Merci

  6. #6
    Membre expérimenté Avatar de maxf1
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 229
    Points : 1 371
    Points
    1 371
    Par défaut
    Citation Envoyé par fr1man
    Je ne vois pas en quoi Spring pose problème dans ce cas.
    Dans quel cas?

    Citation Envoyé par hocinema
    Oui mais alors comment faire si on utilise Spring?
    As tu lu ce que j'ai marqué? As tu essayé l'initialisation? (mon 2ieme "si" car le premier lazy c'est pas super si tu ne doit pas accéder a tous tes sous objets)

  7. #7
    Membre régulier
    Inscrit en
    Juillet 2003
    Messages
    229
    Détails du profil
    Informations forums :
    Inscription : Juillet 2003
    Messages : 229
    Points : 90
    Points
    90
    Par défaut
    Tout ça n'est pas tres clair!

  8. #8
    Expert confirmé
    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
    Points : 4 141
    Points
    4 141
    Par défaut
    Sinon il te faut appeler ton object avant que la session soit close (si tu utilises Spring et que tu le laisse gérer tout seul les sessions ce n'est donc pas possible (ou alors je ne sais pas comment faire)).
    Je ne vois pas en quoi Spring pose problème.

    Pour ce qui est du problème, la réponse à été donnée.
    Tu peux aussi utiliser l'attribut fetch dans tes requêtes HQL ou Criteria
    pour charger les données dont tu as besion et éviter ce LazyInitializationException.

  9. #9
    Membre expérimenté Avatar de maxf1
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 229
    Points : 1 371
    Points
    1 371
    Par défaut
    Si il utilise Spring et qu'il laisse Spring géré ces session lui meme il va fermer la session des qu'il aura récupérer l'objet, nan? Et donc ne pourra pas faire de get sur l'objet?

    Si je me trompe fr1man dit le moi... (j'aimerais etre sur ou non de ce que je pense)

  10. #10
    Expert confirmé
    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
    Points : 4 141
    Points
    4 141
    Par défaut
    Dans mon cas, ma session se ferme au commit de ma transaction.
    Je charge donc ce que je veux dans mes objets avant ce commit, et tout se passe bien.

  11. #11
    Membre expérimenté Avatar de maxf1
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 229
    Points : 1 371
    Points
    1 371
    Par défaut
    Citation Envoyé par fr1man
    Dans mon cas, ma session se ferme au commit de ma transaction.
    Je charge donc ce que je veux dans mes objets avant ce commit, et tout se passe bien.

    Avec Spring? Mais dans ton cas tu ne le laisse donc pas gérer les sessions toi moi vu que c'est toi qui fait le commit, non?

  12. #12
    Expert confirmé
    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
    Points : 4 141
    Points
    4 141
    Par défaut
    Spring gère mes transactions et il injecte ma sessionFactory dans mes DAO, pour que je puisse récupérer une session via un getCurrentSession().
    Je ne fais pas donc pas de commit manuel.

  13. #13
    Membre expérimenté Avatar de maxf1
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 229
    Points : 1 371
    Points
    1 371
    Par défaut
    Je comprend plus rien. Il y a 2 ligne tu disais que la session se fermer lorsque tu faisais un commit. J'ai pas du tout capté encore surement du a mon manque d'experience et de la connaissance de tout ce que Spring propose.

    Sinon une question que je me pose moi qui est regarder Spring depuis 2 jours, pourquoi intégrés Spring avec Hibernate? Et non pas seuleument Hibernate? Car je n'ai vu null part marquer l'avantage ou l'inconvénient d'avoir les 2 ou seuleument 1 seules

  14. #14
    Expert confirmé
    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
    Points : 4 141
    Points
    4 141
    Par défaut
    Quand je dis, la session se ferme au commit de ma transaction, ça ne veut pas dire que je fais un commit explicite.

    Deux avantages d'utiliser Spring avec Hibernate :
    - injecter la sessionFactory dans les Dao, pour pouvoir récupérer un objet session(sinon, il faut utiliser la classe HibernateUtil entre autres)
    - gérer les transactions de manière déclarative (dans un fichier xml)
    donc pas de commit, rollback etc dans le code java

  15. #15
    Membre expérimenté Avatar de maxf1
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 229
    Points : 1 371
    Points
    1 371
    Par défaut
    Citation Envoyé par fr1man
    Quand je dis, la session se ferme au commit de ma transaction, ça ne veut pas dire que je fais un commit explicite.

    Deux avantages d'utiliser Spring avec Hibernate :
    - injecter la sessionFactory dans les Dao, pour pouvoir récupérer un objet session(sinon, il faut utiliser la classe HibernateUtil entre autres)
    - gérer les transactions de manière déclarative (dans un fichier xml)
    donc pas de commit, rollback etc dans le code java
    Ok thank you pour ces explications. Je comprend mieux maintenant pourquoi tant de projet ont les 2!

  16. #16
    Membre régulier
    Inscrit en
    Juillet 2003
    Messages
    229
    Détails du profil
    Informations forums :
    Inscription : Juillet 2003
    Messages : 229
    Points : 90
    Points
    90
    Par défaut
    J'airésolu mon probleme:
    Il ne charge pas les relations quand on utilise
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    getHibernateTemplate().load(class, id);
    Cela marche avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    getHibernateTemplate().find("from .. join fetch maRelation", params);
    Merci

  17. #17
    Membre expérimenté Avatar de maxf1
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 229
    Points : 1 371
    Points
    1 371
    Par défaut
    Citation Envoyé par hocinema
    J'airésolu mon probleme:
    Il ne charge pas les relations quand on utilise
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    getHibernateTemplate().load(class, id);
    Cela marche avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    getHibernateTemplate().find("from .. join fetch maRelation", params);
    Merci
    Ah ben oui si tu mets pas le code on pouvait pas le deviner.
    Ceci doit marcher aussi:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    getHibernateTemplate()get(class, id);

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

Discussions similaires

  1. Many-to-one et lazy loading
    Par bidi dans le forum Hibernate
    Réponses: 11
    Dernier message: 11/09/2008, 11h36
  2. [Hibernate]POJO et many-to-one
    Par azpublic dans le forum Hibernate
    Réponses: 3
    Dernier message: 13/07/2006, 15h00
  3. html:select et hibernate many-to-one
    Par davdou dans le forum Struts 1
    Réponses: 1
    Dernier message: 05/07/2006, 14h56
  4. Hibernate : suppression sur relation many to one
    Par taf dans le forum Hibernate
    Réponses: 1
    Dernier message: 23/05/2006, 13h08
  5. [hibernate] "many-to-one"
    Par mehdi_swatch dans le forum Hibernate
    Réponses: 26
    Dernier message: 12/05/2006, 20h11

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