Bonjour,
le but du jeu est de minimiser les contrôles dans le code applicatif : les cas de modifications concurrentes sont signalées par Hibernate par l'envoi d'une StaleObjectStateException.
Pour ajouter le "versioning" à une entité, il suffit de déclarer une propriété de type intégral spécifique (typiquement "version") qui servira de numéro de version (cf. documentation Hibernate :
http://www.hibernate.org/hib_docs/v3/reference/en/html_single/#mapping-declaration-version).
Si tu utilises XDoclet, il faut ajouter le tag "@hibernate.version" sur cette propriété.
Au final, il faut avoir l'élément "version" dans le fichier de mapping pour la classe considérée.
Si tu utilises Hibernate Annotations, c'est l'annotation "@Version".
Dès lors, lorsque ton code va soumettre une instance à Hibernate pour persistence, celui-ci va vérifier le numéro de version de celle-ci par rapport à ce qu'il y a dans la base. Si l'état en base est plus récent que celui que tu soumets, une StaleObjectStateException sera levée.
A toi de la gérer alors, typiquement en relisant l'état de ton entité depuis la base et en relançant tout le process qui t'a mené au point où tu en es (réaffichage de formulaire, entrée utilisateur, etc...).
Note: tu peux également utiliser une propriété de type temporel pour effectuer le "versioning" (qui correspondra à la date de dernière modification de l'entité). Dans ce cas, il faut déclarer un "timestamp" et non plus une "version" dans le fichier de mapping.
J'espère que cela aide.