Nous utilisons Hibernate Spring MVC avec le filtre OpenSessionInView. Voici un problème que nous courons dans (code pseudo)Problème de transaction Hibernate
transaction 1
load object foo
transaction 1 end
update foo's properties (not calling session.save or session.update but only foo's setters)
validate foo (using hibernate validator)
if validation fails ?
go back to edit screen
transaction 2 (read only)
load form backing objects from db
transaction 2 end
go to view
else
transaction 3
session.update(foo)
transaction 3 end
le problème que nous avons est si la validation échoue foo est marqué « sale » à la séance de mise en veille prolongée (puisque nous utilisons OpenSessionInView nous n'avons une session tout au long de la requête http), lorsque nous chargeons les objets backing de formulaire (comme une liste de certaines entités utilisant une requête HQL), hibernate avant d'effectuer les vérifications de requêtes s'il y a des objets sales dans la session, il voit que foo est et le vide, lorsque la transaction 2 est validée, les mises à jour sont écrites dans la base de données. Le problème est que même s'il s'agit d'une transaction en lecture seule et même si foo n'a pas été mis à jour dans la transaction 2, hibernate ne sait pas quel objet a été mis à jour dans quelle transaction et ne vide pas les objets de cette transaction. Des suggestions? Quelqu'un a couru dans le même problème avant
Mise à jour: ce poste jette un peu plus de lumière sur le problème: http://brian.pontarelli.com/2007/04/03/hibernate-pitfalls-part-2/
le truc est dans la session, que voulez-vous dire par le remplacer? – talg
appel get (foo.id), puis fusionner (foo) – Elie