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 :

Problème de raffraichissement des données


Sujet :

Hibernate Java

  1. #1
    Membre éclairé
    Inscrit en
    Avril 2006
    Messages
    238
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 238
    Par défaut Problème de raffraichissement des données
    Bonjour à tous,

    Je suis confronté à un probleme qui me turlupine...

    Quand j'ouvre une fenetre qui me permet de modifier des données d'un objet mappé Hibernate, une fois validé, les propriétés de l'objet modifié s'affichent à l'écran.
    Le problème est que (alétoirement) je n'arrive pas à visualiser les modifications dans ma page (alors que l'enregistrement a été validé du côté de la bdd).

    J'ai essayé de rajouter un flush dans la servlet de modification, mais ca change rien ...

    Que faut-il faire ? Puis-je forcer la synchronisation des données avec ma base ? Sachant que le problème n'est pas systématique.

    Merci pour votre aide.

  2. #2
    Membre éclairé
    Inscrit en
    Avril 2006
    Messages
    238
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 238
    Par défaut
    Bonjour,

    quelqu'un saurait me répondre ?
    Je cherche depuis longtemps sans succès !

  3. #3
    Membre éclairé
    Inscrit en
    Avril 2006
    Messages
    238
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 238
    Par défaut
    Bonjour,

    est-ce que je suis le seul dans cette situation ???
    Vu le nombre de personnes qui lisent mon post (et le nombre de réponses obtenues), je me dis que pas mal de personnes se foutent de mon problème...

    Est-ce que c'est parce que le prob est trop simple et, du coup, tout le monde se dit : "Pas la peine de lui répondre, il n'a qu'a savoir comment utiliser Hibernate".
    Ou, au contraire, le prob est tellement complexe que personne ne sait répondre (ce qui m'étonne bcp étant donné que je suis un débutant dans Hibernate).

    En tout cas, je suis un peu déçu de voir que personne ne m'apporte la moindre réponse.

    En gardant toujours l'espoir... je reste, dans le fond, optimiste.
    Bonne journée à vous tous !

  4. #4
    Membre Expert
    Profil pro
    Inscrit en
    Août 2006
    Messages
    3 278
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 3 278
    Par défaut
    Vu le nombre de personnes qui lisent mon post (et le nombre de réponses obtenues), je me dis que pas mal de personnes se foutent de mon problème...
    T'as payé quelque chose pour exiger une réponse à ton problème ?
    Non, ah ok, tu me rassures.

    Pour ce qui est de ton problème, donne plus d'infos, parce que c'est pas avec ce que tu nous as dit qu'on va pouvoir résoudre ton problème.
    Donne nous un peu de code, on y verra peut-être plus clair.

  5. #5
    Membre éclairé
    Inscrit en
    Avril 2006
    Messages
    238
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 238
    Par défaut
    Mon problème survient lorsque je désire récupérer un objet depuis ma base via Hibernate.
    Exemple concret : je crée un objet via un formulaire et le sauvegarde dans ma table comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Session session = HibernateUtil.getCurrentSession();
    Transaction tx = session.beginTransaction();
    T_Dem_S dem_S = new T_Dem_S();
     
    dem_S.setEtat(etat);
    ...
     
    T_Intervenant tIntervenant = (T_Intervenant) session.load(T_Intervenant.class, intervenant);
    tIntervenant.addFicheS(dem_S);
    ...
    session.saveOrUpdate(tIntervenant);
    tx.commit();
    session.flush();
    session.clear();
    Mon objet dem_S est correctement inséré dans ma bdd.
    Par contre, lorsque je souhaite le récupérer via ce code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Session session = HibernateUtil.getCurrentSession();
    Transaction update = session.beginTransaction();
    T_Dem_S demande_S = (T_Dem_S) session.load(T_Dem_S.class,new Integer(sigChangeForm.getId()));
    j'ai ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Exception : org.hibernate.ObjectNotFoundException: No row with the given identifier exists: [tables.T_Dem_S#1836]
    Je ne sais pas si tout ça est clair pour vous...

    1836 correspond à la clef de ma table.
    Ce problème n'est pas systématique, il survient alétoirement.

    J'ai l'impression que mon cache hibernate ne se met pas à jour (malgré mon flush et mon clear).
    Lorsque je veux récupérer un objet depuis ma table, il ne le trouve pas et me déclenche une erreur.

    Etant encore débutant en Hibernate, je suis certain que ça ne doit pas être très compliqué....

  6. #6
    Membre Expert
    Profil pro
    Inscrit en
    Août 2006
    Messages
    3 278
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 3 278
    Par défaut
    Ferme ta session après avoir commité.

  7. #7
    Membre éclairé
    Inscrit en
    Avril 2006
    Messages
    238
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 238
    Par défaut
    Ok,

    il n'y a pas un autre moyen pour forcer le cache à se raffraichir ?
    Car, j'ai peur qu'en fermant/réouvrant des sessions, la mémoire se sature...

  8. #8
    Membre Expert
    Profil pro
    Inscrit en
    Août 2006
    Messages
    3 278
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 3 278
    Par défaut
    Mais non, il n'y a pas de risque et c'est d'ailleurs la pratique à suivre, cf documentation Hibernate.

  9. #9
    Membre éclairé
    Inscrit en
    Avril 2006
    Messages
    238
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 238
    Par défaut
    Je vérifie ça et je vous dis quoi !
    Merci.

  10. #10
    Membre éclairé
    Inscrit en
    Avril 2006
    Messages
    238
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 238
    Par défaut
    J'ai ajouté le session.close après avoir ajouté mon ibjet dans ma base.
    Par contre, j'ai une erreur. Je vous explique :

    Lorsque je fais ensuite appel à une page jsp pour afficher le récapitulatif de ce qui vient d'être saisi, j'ai (à chaque fois) le message suivant :
    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
    javax.servlet.ServletException: Session is closed!
    	org.apache.struts.action.RequestProcessor.processException(RequestProcessor.java:523)
    	org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:421)
    	org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:224)
    	org.apache.struts.action.ActionServlet.process(ActionServlet.java:1196)
    	org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:432)
    	javax.servlet.http.HttpServlet.service(HttpServlet.java:763)
    	javax.servlet.http.HttpServlet.service(HttpServlet.java:856)
    	sun.reflect.GeneratedMethodAccessor73.invoke(Unknown Source)
    	sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    	java.lang.reflect.Method.invoke(Method.java:585)
    	org.apache.catalina.security.SecurityUtil$1.run(SecurityUtil.java:243)
    	java.security.AccessController.doPrivileged(Native Method)
    	javax.security.auth.Subject.doAsPrivileged(Subject.java:517)
    	org.apache.catalina.security.SecurityUtil.execute(SecurityUtil.java:275)
    	org.apache.catalina.security.SecurityUtil.doAsPrivilege(SecurityUtil.java:161)
    Je vous donne une partie de ma jsp :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    <body>
    <div class="t_titres" >
    <fmt:message key="message.creation.confirmation"/>
    </div>
    <br/><br/><br/>
     
    <div class="texte" >
     
    <span class="color_gris">
    	<fmt:message key="form.application" />
    </span>
    &nbsp;<c:out value="${sigSout.application}"/>
    <br/>
    Pouvez-vous me guider ? Merci.

  11. #11
    Membre Expert
    Profil pro
    Inscrit en
    Août 2006
    Messages
    3 278
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 3 278
    Par défaut
    Tu essaies de charger des données dans ta jsp via Hibernate, alors que la session est fermée, logique qu'il y ait plantage.
    2 solutions :
    - charger toutes les donnnées dont tu as besoin dans ta jsp, avant de fermer ta sesssion, c'est à dire avant de rendre la main à la vue
    - utiliser le pattern open session un view, comme par exemple un filtre de servlet
    Tu trouveras des explications dans la doc Hibernate et sur le site d'Hibernate en cherchant un peu.

  12. #12
    Membre chevronné
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    365
    Détails du profil
    Informations personnelles :
    Localisation : Maroc

    Informations forums :
    Inscription : Janvier 2006
    Messages : 365
    Par défaut
    Bonjour,
    La dernière erreur voudrait dire que l'objet n'a pas été chargé avant la fermeture de la session. En effet, à l'appel de la méthode load(), Hibernate n'accède pas directement à la base de données et crée plutôt un objet proxy représentant l'objet que tu charges. Ce n'est que lorsque tu appelles un getter sur l'objet que le chargement est fait depuis la base de données. C'est assez bizzare, mais je crois que c'est comme ça qu'il fonctionne. Essaie donc d'appeler un getter sur l'objet avant de fermer la session, ceci devrait forcer son chargement.
    J'espère que ça aide.

  13. #13
    Membre éclairé
    Inscrit en
    Avril 2006
    Messages
    238
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 238
    Par défaut
    En cherchant un peu, j'ai finalement opté par fermer la session Hibernate a chaque fois que j'effectue un traitement (et ce, dans chaque classe java qui effectue un accès à ma base).

    Dans mes classes, j'ai donc ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Session session = HibernateUtil.getCurrentSession();
    Transaction tx = session.beginTransaction();
    /*
    traitements divers...
    */
    session.saveOrUpdate(tIntervenant);
    tx.commit();
    HibernateUtil.closeSession();
    Mais j'ai peur qu'à force d'ouvrir/fermer ma session, ma mémoire sature.
    Qu'est ce que vous en pensez ???

  14. #14
    Membre Expert
    Profil pro
    Inscrit en
    Août 2006
    Messages
    3 278
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 3 278
    Par défaut
    Pourquoi veux tu que ta mémoire sature ?

    La session n'est pas faite pour avoir une durée de vie égale à celle de l'application.

    http://www.hibernate.org/hib_docs/v3...actions-basics

    Extrait de la doc officielle:
    Un objet Session est relativement simple et n'est threadsafe. Il est également peu coûteux à créer. Il devrait n'être utilisé qu'une seule fois, pour un processus d'affaire ou une unité de travail ou une conversation et ensuite être relâché. Un objet Session ne tentera pas d'obtenir de connexion ( Connection ) JDBC (ou de Datasource ) si ce n'est pas nécessaire.

  15. #15
    Membre éclairé
    Inscrit en
    Avril 2006
    Messages
    238
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 238
    Par défaut
    C'est bon, ça marche super bien !
    Merci @ tous !

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

Discussions similaires

  1. [VB6]problème d'insertion des donneés dans une base d'Access2003
    Par lanbok dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 27/05/2006, 12h17
  2. problème de consolidation des données
    Par iam dans le forum Bases de données
    Réponses: 1
    Dernier message: 21/05/2006, 13h31
  3. [Dates] Problème de réaffichage des données
    Par HwRZxLc4 dans le forum Langage
    Réponses: 7
    Dernier message: 10/05/2006, 21h04
  4. Problème à l'importation des données
    Par steinfield dans le forum Access
    Réponses: 2
    Dernier message: 24/04/2006, 16h02
  5. [JTable] Problème d'affichage des données
    Par ddams dans le forum Composants
    Réponses: 2
    Dernier message: 15/09/2004, 17h07

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