2011-03-15 1 views
2

Je suis nouveau à utiliser le mécanisme de "verrouillage optimiste" - J'utilise Hibernate (dans Jboss) et Container Managed Transaction (CMT). Je souhaite gérer le scénario lorsque, entre mes entités -read et entité-mise à jour quelqu'un d'autre met à jour la même entité (c'est-à-dire la ligne) dans la base de données. Dans ce cas, je veux jeter exception ..Question de base sur le verrouillage optimiste (Hibernate)

J'ai annoté mon entité avec @Version - comme

@Version 
private Long version; 

Maintenant, je suis confus si cela est suffisant pour la gestion de version ou je dois appeler explicitement le EntityManager.lock() api comme

{ 
    . 
    . 
    final QueryDTO queryDTO = entityManager.find(QueryDTO.class, id); 
    entityManager.lock(queryDTO, LockModeType.READ); 
    queryDTO.setStatus(updatedStatus); 
    entityManager.persist(queryDTO); 
    } 

Merci à l'avance,

Répondre

6

Vous n'avez pas besoin serrures explicites (p Verrouillage essimiste) lors de l'utilisation du verrouillage optimiste via @Version. Lorsque l'entité est mis à jour la base de données, quelque chose comme la requête suivante aura lieu:

UPDATE QueryDTO SET status=<updated status>, ...other values..., version=100 WHERE id=<id> AND version=99

Si la mise à jour échoue (quelqu'un/quelque chose a changé les données et la version), vous obtiendrez OptimisticLockException (Puisque vous utilisez EntityManager, je suppose que c'est à propos de JPA, dans Hibernate "cru" cela aurait pu être quelque chose comme StaleStateException).

Questions connexes