2011-08-18 27 views
1
List <Student> st = session.createQuery ("select ids from students where a = :a") 
         .setString("a", value) 
         .list(); 

//Errors out saying that ArrayList is an unknown entity 
session.lock(st, LockMode.UPGRADE); 

學生本身擴展Serializable。你如何在Hibernate中鎖定Serailizables的數組列表?休眠鎖定項目的陣列列表

+1

將學生重命名爲學生? – Bas

回答

3

您需要旋轉列表並逐個鎖定實體。

for(Student s : st) { 
    session.lock(s, LockMode.UPGRADE); 
} 

注: 您也可以直接在查詢通過Query.setLockMode(java.lang.String, org.hibernate.LockMode)鎖:Session#lock(java.lang.Object, org.hibernate.LockMode)是贊成session.buildLockRequest(LockMode.UPGRADE).lock(學生)

UPDATE的棄用。

+0

這裏是否有競爭條件,因爲兩個線程觸發了同一個查詢,並且一個迭代了一個獲取的鎖,另一個獲取了另一個鎖。我想避免循環,正在發射查詢選擇..更新最好的方式,然後 – kal

+0

@kal是的,絕對。在查詢本身上設置鎖定模式可能會減輕這種擔憂,至少儘可能地在數據庫級鎖定之外。 –