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 :

[GWT] Mauvaises données récupérées [Core]


Sujet :

Hibernate Java

  1. #1
    Futur Membre du Club
    Femme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2012
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Septembre 2012
    Messages : 5
    Par défaut [GWT] Mauvaises données récupérées
    Bonjour,

    J'ai une application GWT utilisant Hibernate et la librairie GXT3.0.
    J'ai du côté client, un tableau m'affichant une liste de demandes contenant un bouton permettant de l'accepter.
    Lorsque je clique sur ce bouton, le statut de la demande est bien mis à jour dans ma BDD (MySQL).
    Cependant lorsque je rafraîchi mon tableau, les données affichées sont aléatoirement : soit les anciennes, soit les nouvelles.

    Lorsque je log les données renvoyées à l'IHM:

    - si je récupère mes données avec un criteria.list() de Hibernate => Les valeurs sont mauvaises
    - si je crée une requête HQL => Les données sont également mauvaises
    - si je crée une requête SQL par Hibernate => Les données sont aussi mauvaises
    - si je crée une requête SQL sans passer par Hibernate => les données sont bonnes.

    J'ai essayé pas mal de choses dont :

    - vérifier que le cache de 2nd niveau et query de hibernate soit désactivé, en ajoutant à hibernate.cfg.xml:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <property name="hibernate.cache.provider_class">org.hibernate.cache.NoCacheProvider</property>
    <property name="hibernate.cache.use_second_level_cache">false</property>
    <property name="hibernate.cache.use_query_cache">false</property>
    - A chaque modification en base faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    currentSession().flush();
    currentSession().getTransaction().commit();
    currentSession().clear();
    currentSession().close();
    - A chaque ouverture de session :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SESSION_FACTORY.evictQueries();
    s.setCacheMode(CacheMode.REFRESH);
    s.setFlushMode(FlushMode.ALWAYS);
    (J'ai également essayé avec tous les autres modes dont CacheMode.NEVER et FlushMode.COMMIT)

    pour information : voici la méthode currentSession(); :

    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
    26
    private static final ThreadLocal SESSION = new ThreadLocal();
     
    /**
     * Session Factory which manage the sessions.
     */
    private static final SessionFactory SESSION_FACTORY;
     
    static {
        try {
             SESSION_FACTORY = new Configuration().configure().buildSessionFactory();
        } catch (HibernateException ex) {
             throw new HibernateException("Problème de configuration : " + ex.getMessage(), ex);
        }
    }
     
    public static Session currentSession() throws HibernateException {
        Session s = (Session) SESSION.get();
        if (s == null || !s.isOpen() || !s.isConnected()) {
            s = SESSION_FACTORY.openSession();
            SESSION_FACTORY.evictQueries();
            SESSION.set(s);
        }
        s.setCacheMode(CacheMode.REFRESH);
        s.setFlushMode(FlushMode.ALWAYS);
        return s;
    }
    - J'ai aussi essayé de faire un refresh() systématique sur toutes les données que je récupère en base.

    - J'ai également essayé de récupérer une première fois mes données, de faire un evict() sur chacune d'elles. De faire un clear() puis de les récupérer de nouveau.

    - Enfin j'ai essayé d'appeler mes méthodes dans un test JUnit (avec une boucle for pour le lancer 50 fois vu que les données retournées sont aléatoirement bonne ou mauvaises). Lorsque je passe par JUnit les données sont les bonnes.

    Je suis à court d'idées . Et c'est assez urgent.

    Si quelqu’un à une suggestion je suis preneuse !

    [Résolu]
    J'ai remplacé mon

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Session s = (Session) SESSION.get();
    if (s == null || !s.isOpen() || !s.isConnected()) {
       s = SESSION_FACTORY.openSession();
       SESSION_FACTORY.evictQueries();
       SESSION.set(s);
    }
    code que j'avais récupéré sur internet au début du projet où j'y connaissais rien en Hibernate,

    par

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public static Session currentSession() throws HibernateException {
    Session s = SESSION_FACTORY.getCurrentSession();
    return s;
    après avoir vu que le .openSession() était dangereux. Je pense que du coup plusieurs sessions étaient ouvertes et entraient en conflit

  2. #2
    Membre éclairé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2006
    Messages
    288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2006
    Messages : 288
    Par défaut
    Est-ce que tu peux poster toute la configuration de la base de données ?
    Je voudrais voir également le service qui appele la DAO et éventuellement la configuration.
    Merci de lire les règles du forum et surtout celle là Message clair et précis.
    Evitons les ctrl c ctrl v => Ne sortons pas les codes de leur contexte sinon ça ne marche pas.

  3. #3
    Futur Membre du Club
    Femme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2012
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Septembre 2012
    Messages : 5
    Par défaut
    Mon hibernate.cfg.xml :
    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
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE hibernate-configuration PUBLIC
    		"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
    		"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
    <hibernate-configuration>
        <session-factory>
            <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
            <property name="hibernate.connection.password">monpassword</property>
            <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/maBase</property>
            <property name="hibernate.connection.username">monuser</property>
            <property name="hibernate.dialect">org.hibernate.dialect.MySQLInnoDBDialect</property>
            <property name="current_session_context_class">thread</property>
            <property name="hibernate.show_sql">false</property> 
            <property name="hibernate.cache.provider_class">org.hibernate.cache.NoCacheProvider</property>
            <property name="hibernate.cache.use_second_level_cache">false</property>
            <property name="hibernate.cache.use_query_cache">false</property>
            <property name="hibernate.connection.shutdown">true</property>
            <mapping resource=".../domain/hibernate/AssignmentDocument.hbm.xml"/>
     
        </session-factory>
    </hibernate-configuration>
    Qu'entends tu pas le service qui appelle la DAO et la configuration ?
    Ce problème ce pose pour tous mes services de mon application.

    Un exemple est celui ci :

    La méthode qui récupère toutes mes demandes :
    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
    final String className = classToFind.getSimpleName();
    LOG.debug("finding " + className + " instance by example");
    try {
    	session = getSession();
    	Criteria criteria = session.createCriteria(PACKAGE + classToFind.getSimpleName());
    	@SuppressWarnings("unchecked")
    	final List<D> results = criteria.list();
    	for (D current : results) {
    		session.refresh(current);
    	}
    	LOG.debug("find by example successful, result size : " + results.size());
    	return results;
    } catch (HibernateException re) {
    	LOG.error("find by example failed", re);
    	throw re;
    }
    Le service qui met à jour le statut :
    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
    // On récupère la demane de réservation en base grâce à son id
    final ReservationAsking reservation = ReservationAskingPersistence.findById(idReservationAsking);
     
    // On lui affecte le statut "refusée"
    reservation.setReservationState(ReservationStatePersistence.findById(ReservationState.WAITING_ASSIGNMENT));
     
    HibernateUtil.beginTransaction();
    try {
          // On la met à jour en base
          ReservationAskingPersistence.merge(reservation);
     
          HibernateUtil.commit();
    } catch (HibernateException e) {
          e.printStackTrace();
          HibernateUtil.rollback();
          throw new HibernateException(e);
    }
    La methode merge :
    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
    LOG.debug("merging " + instance.getClass().getSimpleName() + " instance");
    try {
    	session = getSession();
    	boolean closeSession = true;
    	Transaction tx = session.getTransaction();
    	final boolean isActive = tx.isActive();
    	if (isActive) {
    		closeSession = false;
    	} else {
    		tx = session.beginTransaction();
    	}
    	@SuppressWarnings("unchecked")
    	final D result = (D) session.merge(instance);
    	if (closeSession) {
    		HibernateUtil.commit();
    	}
    	LOG.debug("merge successful");
    	return result;
    } catch (HibernateException re) {
    	LOG.error("merge failed", re);
    	throw re;
    }
    Merci pour ton aide

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 10/10/2007, 10h42
  2. Réponses: 6
    Dernier message: 30/07/2007, 15h48
  3. Réponses: 6
    Dernier message: 07/06/2007, 12h07
  4. [MySQL] Problème d'insertion des donne récupère ds la BDD
    Par makaphrodite dans le forum PHP & Base de données
    Réponses: 8
    Dernier message: 30/12/2006, 12h46
  5. probleme select : mauvaise ligne récupérée
    Par ffraggy dans le forum Oracle
    Réponses: 5
    Dernier message: 15/06/2006, 08h50

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