Bonjour a tous,
j'ai un curieux problème :
je développe une application web (tomcat 5, struts 1.1, hibernate 2.0, postgresql) dans laquelle je lis et je modifie un bean User tout simple. Lorsque je modifie la valeur d'une propriété de ce bean puis que je l'update, l'entrée est bien modifiée en base. Par contre, quand je le relis plusieurs fois de suite, j'obtiens de temps en temps les anciennes valeurs de la propriété modifiée, d'autres fois la nouvelle valeur. En modifiant et updatant plusieurs fois, ma base est toujours correctement updatée mais les relectures me donnent un peu n'importe quelle valeur précédente.
Je crois que le problème vient peut-être de ce que je n'ai pas bien compris quand refermer mes sessions (dois-je les refermer après chaque transaction ou est-ce que je dois garder la même session hibernate pour une session tomcat).
Un peu de code sera plus parlant :
Le mapping de mon User :
Code:
<class name="atr.metier.User" table="tab_user">
<id name="id" type="long" column="user_id" unsaved-value="0">
<generator class="sequence">
<param name="sequence">seq_user</param>
</generator>
</id>
<property name="userName" column="user_name"/>
<property name="password" column="user_pass"/>
<property name="firstName" column="user_fname"/>
<property name="lastName" column="user_lname"/>
<property name="email" column="user_mail"/>
<property name="nbPicsParPage" column="user_nbpics"/>
<property name="style" column="user_style"/>
<property name="registrationDate" column="user_reg_date"/>
<property name="admin" column="user_admin"/>
</class>
Le equals de mon User (qui n'est que getter et setter par ailleurs):
Code:
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (!(obj instanceof User)) {
return false;
}
final User that = (User) obj;
return (getPassword() == null && that.getPassword() == null || getPassword() != null
&& getPassword().equals(that.getPassword()))
&& (getEmail() == null && that.getEmail() == null || getEmail() != null
&& getEmail().equals(that.getEmail()))
&& (getFirstName() == null && that.getFirstName() == null || getFirstName() != null
&& getFirstName().equals(that.getFirstName()))
&& (getLastName() == null && that.getLastName() == null || getLastName() != null
&& getLastName().equals(that.getLastName()))
&& (getUserName() == null && that.getUserName() == null || getUserName() != null
&& getUserName().equals(that.getUserName()))
&& (getNbPicsParPage() == null && that.getNbPicsParPage() == null || getNbPicsParPage() != null
&& getNbPicsParPage().equals(that.getNbPicsParPage()))
&& (getStyle() == null && that.getStyle() == null || getStyle() != null
&& getStyle().equals(that.getStyle()))
&& (getAdmin() == null && that.getAdmin() == null || getAdmin() != null
&& getAdmin().equals(that.getAdmin()))
&& (getRegistrationDate() == null && that.getRegistrationDate() == null || getRegistrationDate() != null
&& getRegistrationDate().equals(that.getRegistrationDate()));
}
Les méthodes de lecture et d'update :
Code:
public static void modifyUser(User user) throws HibernateException {
if (user != null) {
HibernateSessionFactory.closeSession();
Session session = HibernateSessionFactory.currentSession();
Transaction tx = session.beginTransaction();
session.saveOrUpdate(user);
tx.commit();
HibernateSessionFactory.closeSession();
}
}
public static Collection getUsers() throws HibernateException {
List result = null;
Session session = HibernateSessionFactory.currentSession();
Transaction tx = session.beginTransaction();
result = session.createQuery("from atr.metier.User").list();
tx.commit();
return result;
}
Si par exemple mon bean a la propriété style fixée à "Jaune", que je la passe à "Bleu", que j'update via modifyUser, la base est mise à jour ; si j'appelle getUsers, le User que je récupère de la liste est parfois à "Jaune", parfois à "Bleu", sans que je comprenne pourquoi l'une ou pouquoi l'autre.
Merci de votre aide.