Bonjour,
J'ai une application GWT utilisant Hibernate3 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:
<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:
currentSession().flush();
currentSession().getTransaction().commit();
currentSession().clear();
currentSession().close();
- A chaque ouverture de session :
Code:
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:
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:
Session s = (Session) SESSION.get();
if (s == null || !s.isOpen() || !s.isConnected()) {
s = SESSION_FACTORY.openSession();
SESSION_FACTORY.evictQueries();
SESSION.set(s);
}
par
Code:
public static Session currentSession() throws HibernateException {
Session s = SESSION_FACTORY.getCurrentSession();
return s;