2010-06-12 20 views
9

Pobieram listę obiektów w stanie hibernacji za pomocą interfejsu API Criteria. Jednak potrzebuję zablokować te obiekty, ponieważ inny wątek wykonywany w tym samym czasie dostanie dokładne obiekty i tylko jeden z wątków odniesie sukces pod nieobecność pesymistycznej blokady.Jak określić pesymistyczną blokadę za pomocą API Criteria?

Próbowałem jak poniżej, ale to nie działa.

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(); 

Aktualizacja: Ja wykonywania aktualizacji po tym oświadczeniu, tak, że chciałbym oba wątki czytać różne wiersze lub przynajmniej drugi wątek powinien czekać, aż pierwszy wątek kończy z transakcją i opuszcza zamek.

Zapytanie wygenerowane przez hibernację znajduje się poniżej.

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 ? 

Aktualizacja: Wydaje się to błąd w wersji 3.5.2 Pascal Thivent (dzięki dużo Pascal) wspomniano, mam dołączył jako członek i oglądając ten problem. Mam nadzieję, że zostanie uwzględniony w następnym wydaniu.

Jednak próbowałem użyć innego podejścia tutaj z session.buildLockRequest() ... ale nie mogłem się dowiedzieć, jak go używać i używanie poniższego kodu nie ma żadnego efektu.

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

Co masz na myśli mówiąc "nie działa"? AFAIK bez blokad oba odczyty powinny odnieść sukces. –

+0

@ Péter, zaktualizowałem moje pytanie. Zasadniczo chcę wykonać aktualizację po tym wybierz. – Reddy

Odpowiedz

3

Jakiej wersji Hibernate używasz? Czy to może być HHH-5275? Czy na pewno instrukcja FOR UPDATE nie została wygenerowana? Czy możesz pokazać wygenerowany kod SQL?

+0

To jest zapytanie wygenerowane przez hibernate (Version: 3.5.2 Final) A tak, to wygląda na HHH-5275, więc czy oznacza to, że musimy poczekać do następnej wersji? :( Hibernate: wybierz this_.id jako id1_0_, this_.name jako name1_0_, this_.orderitem_id jako orderitem3_1_0_, this_.status jako status1_0_, this_.store jako store1_0_, this_.vendor jako vendor1_0_, this_.version jako version1_0_ z reddy_pool this_.status =? i and this_.name =? zamawiam przez ten limit asc? – Reddy

+0

Dzięki Pascal, próbowałem innego podejścia do użycia sesji do umieszczenia blokady (zobacz drugą aktualizację w moim pytaniu), ale to nie działa – Reddy

+0

Musiałem również zamienić moje zapytanie o kryteria z tego powodu: wydaje się, że to wielka sprawa - dlaczego HH-5275 jest zanotowany jako nieistotny? –

Powiązane problemy