Hibernate, problème d'update
Bonjour,
Je rencontre un problème très étrange et je m'arrache les cheveux dessus depuis quelques jours.
Pour résumer, lorsque je met à jour un champ d'un objet et que je fait un session.merge, ce n'est parfois pas le bon objet qui est mis à jour, ou parfois il met bien à jour mon objet mais m'en met à jour un autre avec des valeurs d'une mise à jour précédente ...
Plus en détails :
J'ai une table document, chaque document a une colonne ordre qui spécifie l'ordre d'affichage.
Dans mon interface, j'ai des boutons haut/bas, pour faire passer un document au dessus/en dessous de celui du dessus/dessous. (donc modifier l'ordre des documents dans la liste)
Quand l'utilisateur clique sur le bouton haut par exemple, je récupère dans la liste de documents affichée le document concerné par le clic, et celui du haut, puis je swappe les valeurs de la colonne "order" des deux documents, et je les sauvegarde (session.merge)
Le résultat est que parfois la mise à jour n'a pas lieu, et d'autres documents de la liste sont modifiés arbitrairement avec des valeurs d'updates précédentes.
D'après les tests que j'ai fait, mon code modifie bien les objets comme il faut, c'est au moment de mettre à jour la base de données avec hibernate que ca déconne ...
De plus, dans les logs il y a parfois 3 ou 4 requêtes updates alors que mon code n'en appelle que 2 ...
Clic sur un bouton
Code:
1 2 3 4 5 6 7 8 9
|
int y=coord.getY();
Document currentDocument=list.get(y);
int toSwapY=command.equals("up")?y-1:y+1;
Document toSwapDocument=list.get(toSwapY);
DocumentHandler.swapOrder(currentDocument, toSwapDocument);
refreshDocumentList(); |
Méthode swapOrder de DocumentHandler :
Code:
1 2 3 4 5 6 7 8
|
public static void swapOrder(Document doc1, Document doc2){
int tmpOrder=doc1.getOrder();
doc1.setOrder(doc2.getOrder());
doc2.setOrder(tmpOrder);
HibernateUtil.update(doc1);
HibernateUtil.update(doc2);
} |
Méthode update de HibernateUtil :
Code:
1 2 3 4 5 6 7 8
|
public static void update(Object object){
Session session = HibernateUtil.currentSession();
Transaction tx= session.beginTransaction();
session.merge(object);
tx.commit();
HibernateUtil.closeSession();
} |
Les méthodes equals et hashcode sont redéfinies pour Document (basées sur la clé primaire)
Si quelqu'un pense avoir une idée d'où pourrait venir le problème, ou une piste ... là, j'avoue ne pas comprendre du tout ...
Au pire je ferai une mise à jour en SQL, même si c'est un peu crasseux.