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
Méthode swapOrder de DocumentHandler :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 update de HibernateUtil :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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); }
Les méthodes equals et hashcode sont redéfinies pour Document (basées sur la clé primaire)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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(); }
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.
Partager