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 :

Pb de rafraichissement des pages


Sujet :

Hibernate Java

  1. #1
    Membre expérimenté
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2003
    Messages
    1 309
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 309
    Points : 1 385
    Points
    1 385
    Par défaut Pb de rafraichissement des pages
    J'utilise Hibernate pour accéder à mes données Oracle et le cache de niveau 2 pour les données du référentiel. J'utilise le système de version pour gérer la concurrence d'accès. J'ai un problème de rafraichissement des pages. Un utilisateur sauvegarde des données et la page n'est pas rafraichie correctement. Exemple :
    Utilisateur A sur poste A avec login "ges".
    Utilisateur B sur poste B avec login "ges". (poste n'ayant jamais accédé à l'application)
    L'utilisateur A modifie la Mobilite d'identifiant 44. (données bien modifiées en base) Il va ensuite sur la recherche des Mobilite et cherche la 44. L'affichage lui donne parfois l'ancienne version.
    Même chose pour B où il ne peut pas y avoir de cahce navigateur car il n'a jamais accédé à l'application.

    hibernate.cfg.xml
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    ...
    <property name="hibernate.transaction.factory_class">org.hibernate.transaction.JDBCTransactionFactory</property>
    <property name="hibernate.current_session_context_class">thread</property>
    <property name="hibernate.connection.autocommit">true</property> 
    <property name="hibernate.cglib.use_reflection_optimizer">false</property>
     
    <property name="cache.use_second_level_cache">true</property>
    <property name="cache.provider_class">org.hibernate.cache.OSCacheProvider</property>
    <property name="cache.use_query_cache">false</property>
    ...
    <class-cache class="fr.cg92.stase.business.profil.Profil" usage="read-write" />
    HibernateSessionFactory.java :
    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
     
    private static final ThreadLocal threadLocal = new ThreadLocal();
    private static final Configuration cfg = new Configuration();
    private static SessionFactory sessionFactory;
     
    public static Session currentSession() throws HibernateException {
    	Session session = (Session) threadLocal.get();
     
    	if (session == null) {
    		if (sessionFactory == null) {
    			try {
    				// cfg.configure(CONFIG_FILE_LOCATION);
    				cfg.configure();
    				sessionFactory = cfg.buildSessionFactory();
    			} catch (Exception e) {
    				System.err.println("%%%% Error Creating SessionFactory %%%%");
    				e.printStackTrace();
    			}
    		}
    		session = sessionFactory.openSession();
    		threadLocal.set(session);
    	}
    	return session;
    }
    Enregistrement d'une Mobilite
    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
     
    public static void store(Mobilite mobilite) throws StaleObjectStateException, Exception {
    	Session session = HibernateSessionFactory.currentSession();
    	try {
    		session.beginTransaction();
    		session.saveOrUpdate(mobilite);
    		session.getTransaction().commit();
    		session.clear();
    	} catch (StaleObjectStateException sose) {
    		log.error("Mobilites - store ", sose);
    		session.getTransaction().rollback();
    		session.clear();
    		throw new StaleObjectStateException("Mobilites - store ", sose);
    	} catch (Exception e) {
    		log.error("Mobilites - store ", e);
    		session.getTransaction().rollback();
    		session.clear();
    		throw new Exception("Mobilites - store ", e);
    	}
    }
    Avec le "session.clear();" il y a moins de pb mais il y en a quand même. J'ai essayé de le remplacer par "session.flush();" ou "session.refresh(mobilite);" mais ce n'est pas mieux.

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

    Informations forums :
    Inscription : Janvier 2006
    Messages : 511
    Points : 514
    Points
    514
    Par défaut
    ferme ta session à la fin de ta transaction. Et ouvre une nouvelle session au début

  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
    Oui je serais aussi d'avis de fermer ta session après ton traitement au lieu de faire des session.clear() tout le temps :

    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
    public static void store(Mobilite mobilite) throws StaleObjectStateException, Exception {
    	Session session = HibernateSessionFactory.currentSession();
    	try {
    		session.beginTransaction();
    		session.saveOrUpdate(mobilite);
    		session.getTransaction().commit();
    	} catch (StaleObjectStateException sose) {
    		log.error("Mobilites - store ", sose);
    		session.getTransaction().rollback();
    		throw new StaleObjectStateException("Mobilites - store ", sose);
    	} catch (Exception e) {
    		log.error("Mobilites - store ", e);
    		session.getTransaction().rollback();
    		throw new Exception("Mobilites - store ", e);
    	} finally{
                  session.close();
                 }
    }

  4. #4
    Membre expérimenté
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2003
    Messages
    1 309
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 309
    Points : 1 385
    Points
    1 385
    Par défaut
    J'ai le pb suivant avec le close :
    20 mars 15:26:47 ERROR [http-8080-Processor25] org.hibernate.LazyInitializationException - 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)
    at org.hibernate.proxy.CGLIBLazyInitializer.intercept(CGLIBLazyInitializer.java:158)
    Avec HibernateSessionFactory.closeSession(); ça passe la première fois mais le deuxième enregistrement (à la suite) ça fait la même erreur. Et les données sont enregistrées. aapamment c'est lors du rechargement de la page.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    public static void closeSession() throws HibernateException {
        Session session = (Session) threadLocal.get();
        threadLocal.set(null);
        if (session != null) {
            session.close();
        }
    }

  5. #5
    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
    C'est pêut-etre parce que tu ne l'a réouvre pas.

    Essaye HibernateSessionFactory.getSession au lieu de HibernateSessionFactory.getCurrentSession

  6. #6
    Membre expérimenté
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2003
    Messages
    1 309
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 309
    Points : 1 385
    Points
    1 385
    Par défaut
    "cfg.buildSessionFactory();" ne la recrée pas ?
    Dans l'exemple que j'ai il n'y a pas de getSession.

  7. #7
    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
    Ouoouuupppsss j'ai rien dit.
    J'avais pas vu que c'était toi qui l'avait faite la classe. Oui c'est bien comme ca. IL te la réouvre à chaque fois normalement.

    Le buildSessionFactory lui ne t'ouvre pas la session mais te crée la factory.
    Alors la franchement je vois pas pourquoi ca plante.

    Ton object Mobilite c'est un nouveau a chaque fois ou c'est toujours le meme?

  8. #8
    Membre expérimenté
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2003
    Messages
    1 309
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 309
    Points : 1 385
    Points
    1 385
    Par défaut
    Ca semble venir de l'ouverture d'autres objets. Je laisse le "HibernateSessionFactory.closeSession();" et je regarde plus profondément.

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

    Informations forums :
    Inscription : Janvier 2006
    Messages : 365
    Points : 495
    Points
    495
    Par défaut
    Salut,
    N'ayant jamais utilisé ThreadLocal, je ne sais pas trop ce qu'il retourne comme type d'objet session ni comment ça fonctionne. Mais à mon avis, étant donné que tu as déclaré dans la config
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <property name="hibernate.current_session_context_class">thread</property>
    tu devrais obtenir tes objets session en utilisant la méthode getCurrentSession() du SessionFactory, au lieu de openSession(). Hibernate se charge d'associer la session au thread courant (ou la transaction courante). Et à la fin de ta mise à jour un simple commit() sur la transaction suffit, sans que tu ais encore besoin d'appeler session.close()
    C'est ce que je fais et ça marche plutot bien.
    En espérant t'avoir aidé.

  10. #10
    Membre expérimenté
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2003
    Messages
    1 309
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 309
    Points : 1 385
    Points
    1 385
    Par défaut
    Pour que ça marche avec le close il faut que j'ajoute lazy="false" dans mes relations (sinon il essaie de charger les données alors qu'il n'y a plus de connexion). Je vais faire comme ça et regarder s'il n'y a plus de pb d'affichage.

  11. #11
    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
    Tu peux utiliser un filtre de Servlet ou Spring pour ouvrir et fermer tes sessions Hibernate, ce qui te permettra de garder lazy="false".

  12. #12
    Membre expérimenté
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2003
    Messages
    1 309
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 309
    Points : 1 385
    Points
    1 385
    Par défaut
    Manblaizo, tu peux me donner un exemple de factory et de config que tu utilises ?

  13. #13
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    511
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 511
    Points : 514
    Points
    514
    Par défaut
    je suis d'accord avec fr1man. Utilise un filtre de servlet dans lequelle tu ouvre une nouvelle session ensuite tu fait tous tes traitements normalement (chain.doFilter(request, response); ) et apres les traitements tu ferme ta session hibernate.

    Donc t as session hibernate ne durera que le temps d'une requete HTTP. Seul detail tu ne dois pas mettre en session HTTP des objets hibernate. Il faut que tu garde en session seulement les "clés" qui te permettront de recharger tes objets depuis la base.

  14. #14
    Membre expérimenté
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2003
    Messages
    1 309
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 309
    Points : 1 385
    Points
    1 385
    Par défaut
    Vous avez un bon exemple de filtre de servlet ?

  15. #15
    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
    Sur le site d'Hibernate:
    http://www.hibernate.org

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

Discussions similaires

  1. Réponses: 8
    Dernier message: 09/04/2010, 10h29
  2. rafraichissement des pages en php
    Par Stéph utilisateur d'acces dans le forum Débuter
    Réponses: 4
    Dernier message: 02/09/2009, 16h48
  3. [Wamp] rafraichissement des pages en local
    Par errog dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 1
    Dernier message: 09/08/2008, 22h40
  4. Rafraichissement des pages consultées
    Par al1_24 dans le forum Internet
    Réponses: 10
    Dernier message: 11/06/2007, 13h25
  5. [AJAX] Rafraichissement des données sur la page
    Par TreizeSegments dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 17/05/2006, 18h32

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