2010-06-12 13 views
9

Je récupère une liste d'objets dans Hibernate en utilisant l'API Criteria. Cependant j'ai besoin de verrouiller sur ces objets car un autre thread s'exécutant en même temps obtiendra les objets exacts et seul un des threads réussira en l'absence d'un verrou pessimiste.Comment spécifier un verrou pessimiste avec l'API Criteria?

J'ai essayé comme ci-dessous, mais cela ne fonctionne pas.

List esns = session 
    .createCriteria(Reddy_Pool.class) 
    .add(Restrictions.eq("status", "AVAILABLE")) 
    .add(Restrictions.eq("name", "REDDY2")) 
    .addOrder(Order.asc("id")) 
    .setMaxResults(n) 
    .setLockMode(LockMode.PESSIMISTIC_WRITE) //not working at all 
    .list(); 

Mise à jour: Je suis d'effectuer une mise à jour après cette déclaration, de sorte que je voudrais les deux fils de lire des lignes différentes ou au moins deuxième fil devrait attendre premier thread termine avec la transaction et laisse le verrou.

Et la requête générée par hibernate est ci-dessous.

Hibernate: select this_.id as id1_0_, this_.name as name1_0_, 
this_.orderitem_id as orderitem3_1_0_, this_.status as status1_0_, 
this_.store as store1_0_, this_.vendor as vendor1_0_, this_.version as version1_0_ 
from reddy_pool this_ 
where this_.status=? and and this_.name=? order by this_.id asc limit ? 

Mise à jour: Il semble un bug dans la version 3.5.2 comme Pascal Thivent (Merci beaucoup Pascal) a mentionné, je l'ai rejoint en tant que membre et en regardant la question. Espérons qu'il sera inclus dans la prochaine version.

Cependant, j'ai essayé d'utiliser une autre approche ici avec session.buildLockRequest() ... mais je n'arrivais pas à comprendre comment l'utiliser et utiliser le code ci-dessous n'a aucun effet.

for (int i=0; i < n; i++) 
    session.buildLockRequest(LockOptions.UPGRADE).lock(esns.get(i)); 
+0

Que voulez-vous dire par "ne fonctionne pas"? AFAIK sans verrous les deux lectures devraient réussir. –

+0

@ Péter, mis à jour ma question. Fondamentalement, je veux effectuer une mise à jour après cette sélection. – Reddy

Répondre

3

Quelle version d'Hibernate utilisez-vous? Est-ce que cela pourrait être HHH-5275? Êtes-vous sûr que l'instruction FOR UPDATE n'est pas générée? Pouvez-vous montrer le SQL généré?

+0

Ceci est la requête générée par hibernate (Version: 3.5.2 Final) Et oui, cela semble HHH-5275, cela signifie-t-il que nous devons attendre jusqu'à la prochaine version? Hibernate: sélectionnez this_.id comme id1_0_, this_.name comme nom1_0_, this_.orderitem_id comme orderitem3_1_0_, this_.status comme status1_0_, this_.store comme store1_0_, this_.vendor comme vendor1_0_, this_.version comme version1_0_ de reddy_pool this_ où this_.status =? et and_.name =? ordre par this_.id asc limite? – Reddy

+0

Merci Pascal.J'ai essayé une autre approche pour utiliser la session pour placer le verrou (voir la deuxième mise à jour dans ma question), mais cela ne fonctionne pas – Reddy

+0

J'ai dû échanger ma requête de critères aussi à cause de ce problème.Il semble être un gros problème - pourquoi HH-5275 est-il noté comme mineur? –