Hibernate: Incrémente un champ entier

Je veux incrémenter un champ dans une table de database en utilisant 1 Hibernate.

Je peux le faire en chargeant simplement un object, en incrémentant la valeur et en mettant à jour l'object mais si un autre thread arrive et met à jour le champ entre le chargement et la mise à jour, la valeur sera corrompue.

J'ai donc appelé une mise à jour directement sur la database:

Query updateHits = createQuery( "UPDATE Job SET hitCount = hitCount + 1 WHERE id = :jobId" ); updateHits.setInteger( "jobId", job.getId() ); updateHits.executeUpdate(); 

Cependant, je crois comprendre que cela contourne le locking optimiste dans la database et que je rencontre actuellement un problème avec des blocages dans le server SQL et je crois que c'est le coupable.

Existe-t-il un moyen d'incrémenter un champ sans appeler la mise à jour directement et tout en conservant l'intégrité des données?

Je peux le faire en chargeant simplement un object, en incrémentant la valeur et en mettant à jour l'object mais si un autre thread arrive et met à jour le champ entre le chargement et la mise à jour, la valeur sera corrompue.

Si le second thread utilise aussi hibernate et que vous utilisez le versioning hibernate (@Version), le premier thread qui commet en premier et modifie l'object va définir la nouvelle version sur l'object.

Lorsque le second commit sera entré, hibernate vérifiera l'échec du verrou optimiste et lancera une exception – StaleObjectException si je ne me trompe pas. Est-ce qu'un bloc de capture autour de votre code concurrent, vous aurez la chance de charger l'object à nouveau et essayez votre mise à jour si cela a du sens. Si vous utilisez JPA, une exception OptimisticLockException sera lancée.

Il y a beaucoup d'informations dans la section Hibernate Optimistic Concurrency Concurrency .

À votre santé!