Bonjour à tous,
Dans une application web Struts/Hibernate (Critéria) /Mysql, je rencontre le pb suivant :
J'implémente deux boutons
- "save" : qui crée/met à jour un enregistrement en BDD, le recharge et l'affiche
- "refresh" : qui recharge l'enregistrement à partir de la BDD
Mon pb repose sur le scénario suivant :
- Modification et sauvegarde d'un enregistrement (bouton "Save") : la donnée est correctement affichée, la base est correctement mise à jour
- rafraichissement de la donnée (bouton refresh) : les données affichées correspondent (aléatoirement) aux valeurs précédentes
Le cache coté client n'est pas en cause.
le cache de second niveau hibernate est désactivé en configuration
Le rechargement en BDD de mon objet se fait via la même méthode, que ce soit après l'enregistrement, ou pour le rafraichissement de mon objet
Les actions Struts se terminent systématiquement par un commit() final
L'enregistrement en base est déclenché par le commit de mon objet hibernate mis à jour (commit() fait avant le rechargement en BDD de la donnée)
Cela me fait penser à un pb de cache Hibernate..
J'ai essayé sans succès plusieurs méthodes pour forcer hibernate à recharger les données en base et/ou supprimer le cache hibernate :
Lors de la création de la session initiale
Code:
session = _sessionFactory.getCurrentSession();
session.setFlushMode( FlushMode.ALWAYS);
session.beginTransaction();
session.setCacheMode(CacheMode.IGNORE);
session.clear();
Lors de la requête de selection :
Code:
Criteria criteria = session.createCriteria(VocalMessage.class);
criteria
.add(Restrictions.eq("id", a_vocalMessageId))
.setLockMode(LockMode.READ);
VocalMessage curRecord = (VocalMessage) criteria.uniqueResult();
if(curRecord != null && !Utils.isEmpty(curRecord.getId())) {
session.refresh(curRecord, LockMode.READ);
}
Auriez vous des idées ou des pistes pour résoudre ce pb ?
Merci bcp.
Patrick.