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 :

hibernate, le cache


Sujet :

Hibernate Java

  1. #1
    Membre averti
    Inscrit en
    Février 2005
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 27
    Par défaut hibernate, le cache
    Comment invalider le cache d'hibernate? et à quel niveau.

    voici mon code

    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
    19
    20
    21
    22
    23
    24
    25
    public void modifierPersonne(Person personne)
     
    	{
     
     
    		Session session = HibernateSessionFactory.currentSession();
    		Transaction tx = session.beginTransaction();
    		session.merge(personne);
    		tx.commit();
     
    	  }
     
     
     
    public List collectionPersonnes()
    	{
    		Session session=HibernateSessionFactory.currentSession();
    		Transaction tx = session.beginTransaction();
    		Criteria cri = session.createCriteria(PesonneView.class);
    		List result = cri.list();
    		tx.commit();
    		return result;	
     
     
    	}
    Apres la modification de mes données, la JSP d'affichage garde tjs les anciennes données même apres plusieurs actualisation. parfois je ferme carrement ma page web et j'ouvre une autre sans résultats. Sachant que quand j'affiche la liste des personnes dans une console d'eclipse, j'obtiens mes données mis à jours. Est ce un probleme lié à hibernate ou à la page JSP(struts)?


    Merci pour votre aide

  2. #2
    Membre averti
    Inscrit en
    Février 2005
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 27
    Par défaut
    Aucune suggestion??

  3. #3
    Membre Expert
    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
    Par défaut
    te permet de vider ta session et donc ton cache de niveau 1.

    Sinon, tu peux fermer ta session après tes commit().

  4. #4
    Membre averti
    Inscrit en
    Février 2005
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 27
    Par défaut
    d'abord je te remercie.
    j'ai utilisé session.clear(),

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    public void modifierPersonne(Person personne)
     
    {
    Session session = HibernateSessionFactory.currentSession();
    Transaction tx = session.beginTransaction();
    session.merge(personne);
    tx.commit();
    session.clear();
     
    }
    Effectivement quand je modifie une personne, la mise à jour apparait juste apres.

    Mais le pb la modification ne marche qu'une seule fois apres le redemarrage du serveur tomcat. si j'essai de Remodifier, la modification est sauté sans relever d'exception.


    Pour session.close();

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    public void modifierPersonne(Person personne)
     
    {
    Session session = HibernateSessionFactory.currentSession();
    Transaction tx = session.beginTransaction();
    session.merge(personne);
    tx.commit();
    session.close();
     
    }
    je me retrouve face au message: javax.servlet.ServletException: Session is closed.


    je commence à perdre espoir

  5. #5
    Membre confirmé
    Inscrit en
    Janvier 2007
    Messages
    100
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Janvier 2007
    Messages : 100
    Par défaut
    Je dis ca sans certitude, mais ne faut-il pas passer la session dans ton merge dans la mesure ou tu as ouvert une transaction ? (pour faire comprendre au merge qu'il appartient à la dites transaction)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Session session = HibernateSessionFactory.currentSession();
    Transaction tx = session.beginTransaction();
    session.merge(personne, session);
    tx.commit();

  6. #6
    Membre Expert
    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
    Par défaut
    J'aimerais savoir où dans ton code, tu fermes ta session ?

    Utilises-tu un filtre de servlet qui te gère tes sessions ?

  7. #7
    Membre averti
    Inscrit en
    Février 2005
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 27
    Par défaut
    J'utilise Struts pour la partie presentation mais j'utilise pas de filtre.

    Voila mon app en bref.
    1 table Personne (sql server)
    1vue PersonneView

    3 methodes:
    -- listerPersonnes (depuis la vue)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    public List listerPersonnes()
    {
        Session session=HibernateSessionFactory.currentSession();
        Transaction tx = session.beginTransaction();
        Criteria cri = session.createCriteria(PersonneView.class);
        List result = cri.list();
        tx.commit();
        return result;	
    }
    --modifierPersonne (dans la table)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    public void modifierPersonne(Personne P)
    {
     
    Session session = HibernateSessionFactory.currentSession();
    Transaction tx = session.beginTransaction();
    session.merge(p);
    tx.commit();
    session.close();
    }
    --afficherPersonne (depuis la vue)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    public PersonneView afficherPersonne(String code)
    {
      Session session = HibernateSessionFactory.currentSession();
      Transaction tx = session.beginTransaction();
      Criteria cri = session.createCriteria(PersonneView.class,code);
      List result = cri.add(Expression.like("code", code)).list();
      PersonneView result=(PersonneView) result.get(0);
      tx.commit();
      return result;
    }

    j'ai 2 pages lister.jsp et editer.jsp (gerées par les actions de struts).
    PersonneListerAction/PersonneListerForm
    PersonneEditerAction/PersonneEditerForm

  8. #8
    Membre Expert
    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
    Par défaut
    Donc tu ne fermes jamais ta session ?

    Pour moi, une session doit avoir une durée de vie assez courte.
    Sois tu fermes ta session à la fin de chaque méthode de service, sois tu utilises un filtre de servlet qui le fait pour toi à l'envoi de la réponse au navigateur.
    Tu peux ainsi profiter du lazy loading, et tes données sont rafraichies à chaque nouvelle requête.

  9. #9
    Membre averti
    Inscrit en
    Février 2005
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 27
    Par défaut
    quand je ferme la session apres chaque commit, le commit lui meme ne reussi pas! et je n'ai que "javax.servlet.ServletException: Session is closed " en retour.
    Comme si le fait de faire "Session session=HibernateSessionFactory.currentSession()" ne peut pas ouvrir une session fermée au prealable.

    Je pense que je vais essayer ta 2eme proposition. Si tu peux me passer des liens qui pourront m'aider je te serai reconnaissante.

  10. #10
    Membre Expert
    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
    Par défaut
    http://www.hibernate.org/43.html

    Tu trouveras pas mal d'infos intéressantes sur le sujet.

  11. #11
    Membre averti
    Inscrit en
    Février 2005
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 27
    Par défaut
    Merci.

    Juste 1 truc, quand je ne fais pas appel à la Vue, c'est à dire, j'affiche depuis la table et je modifier ds la table, les choses ont l'air de tres bien se passer. Les données mis à jour sont affichées sans utiliser "session.close".

    Mais malheureusement, l'utilisation de la vue est necessaire!

  12. #12
    Membre Expert
    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
    Par défaut
    Voilà ce que j'ai trouvé dans la doc:
    Il n'y a pas de différence entre table et vue pour le mapping Hibernate, tant que c'est transparent au niveau base de données (remarquez que certaines BDD ne supportent pas les vues correctement, notamment pour les updates).
    A voir si tu te trouves dans ce cas.

  13. #13
    Membre averti
    Inscrit en
    Février 2005
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 27
    Par défaut
    J'utilise la vue juste pour l'affichage. Pour la mise à jour je modifier directement dans la table.

    je charge depuis la vue et je modifie la table. C'est pourquoi peut etre l'objet correspondant à la Vue (PersonneView) n'est pas mis à jour ds la session.

    ds le cas ou je charge depuis la table et je modifie ds la table, c'est normal que mon objet retourné à été déja mis à jour ds la session... Enfin j'espere que ma reflexion est juste car ça me parait logique.


    Comme t'a dis, je dois rafraichir ma session.

    Merci bcp fr1man

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

Discussions similaires

  1. JPA / Hibernate et cache
    Par florianj dans le forum JPA
    Réponses: 1
    Dernier message: 03/01/2014, 08h50
  2. Hibernate et Caché
    Par imhotep_zr7s dans le forum Hibernate
    Réponses: 0
    Dernier message: 27/04/2009, 15h38
  3. [Hibernate][ehcache][criteria]Requête ignore le cache
    Par BugFactory dans le forum Hibernate
    Réponses: 1
    Dernier message: 25/07/2006, 10h53
  4. [Hibernate] Gérer le cache L2
    Par mauvais_karma dans le forum Hibernate
    Réponses: 2
    Dernier message: 30/08/2005, 11h50
  5. [Hibernate]comprendre la cache sur hibernate
    Par ujoodha dans le forum Hibernate
    Réponses: 16
    Dernier message: 29/08/2005, 09h02

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