Bonjour à tous,
Je rencontre un pb tenace sous une application Web Struts/mySql/Hibernate
Une page d'administration (par exemple) me permet de gérer une table simple (ajout, modification, suppression) via des champs de formulaire.
si je met à jour un enregistrement, la base MySQL est correctement mise à jour, l'enregistrement est correctement rechargé (via un createCriteria()), et affiché en retour à l'utilisateur.
L'utilisation d'un bouton "refresh" (qui relance le meme createCriteria() qu'après l'update) me pose de gros pboblèmes :
De façon aléatoire, ce sont les anciennes valeurs qui sont affichées en retour. Un coup de debug me montre qu'hibernate est alors persuadé que ce sont réellement les données de mon objet.
Sentant des pb de cache (alors que le cache de 2eme niveau est désactivé), j'ai rajouté quelques options espérant résoudre mon pb, mais sans succès (setFlushMode(), setCacheMode(), session.clear(), setLockMode(), session.refresh()..)
la je suis vraiment sec.. d'autant plus que ce pb apparait sur d'autres tables dans des circonstances bcp plus géantes (mise à jour de donnée via Ajax, qui du coup semblent ne pas marcher, alors que c'est hibernate qui ne recharge pas réellement les infos depuis la BDD), etc..
Voici le bout de code en question, ainsi que le mapping hibernate correspondant.
Code:
Configuration c = new Configuration();
c.setEntityResolver( new HbmEntityResolver());
c.configure();
_sessionFactory = c.buildSessionFactory();
...
...
session = _sessionFactory.getCurrentSession();
session.setFlushMode( FlushMode.ALWAYS);
session.beginTransaction();
session.setCacheMode(CacheMode.IGNORE);
session.clear();
...
...
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);
}
actionForm.setId(curRecord getCode());
actionForm.setCode(curRecord getCode());
actionForm.setName(curRecord getDescription());
actionForm.setMessageId(curRecord getMessageIndex());
...
...
session.getTransaction().commit();
Code:
<hibernate-configuration>
<session-factory>
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
<!-- Hibernate's automatic session context management -->
<property name="current_session_context_class">thread</property>
<property name="default-cascade">persist</property>
<!--second-level cache -->
<property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property>
...
...
<hibernate-mapping package="com.test.datamodel">
<class
name="VocalMessage"
table="VOCAL_MESSAGE"
abstract="false"
dynamic-update="false"
dynamic-insert="false"
select-before-update="false"
polymorphism="implicit"
lazy="true">
<id
name="id"
type="string"
access="property"
unsaved-value="null">
<column
name="ID"
length="10"
/>
<generator class="assigned"/>
</id>
<property
name="name"
type="string"
access="property"
update="true"
insert="true"
lazy="false">
<column
name="NAME"
length="50"
unique="false"
not-null="true"
/>
</property>
<property
name="messageId"
type="string"
access="property"
update="true"
insert="true"
lazy="false">
<column
name="MESSAGEID"
length="5"
unique="true"
not-null="true"
/>
</property>
</class>
</hibernate-mapping>
</session-factory>
</hibernate-configuration>
Si l'un de vous a une piste quelquonque je lui serait eternellement redevable ^__^
Merci à tous pour votre aide.
Patrick.