2011-05-14 25 views
4


我有一個hibernate實體,它有一組另一個實體作爲它的字段。像這樣的:如何在Hibernate中執行原子操作?

public class UserEntity implements Srializable { 
    private Set<Role> roles; 
} 

我應該保持表的方式,至少有一個ADMIN用戶總是存在於系統中。這可以以簡單的方式來完成,並且可以象下面這樣:

public void updateUser{ 
    UserEntity ue = getUser(); 
    if (userIsNotTheLastAdmin(ue)) { 
    /** Here is a race condition **/ 
     roles.remove(Role.ADMIN); 
     getSession().saveOrUpdate(ue); 
    }    
} 

但是,當我們有併發操作發生在真正的問題。我如何以原子方式執行所有操作?
謝謝,
HM

回答

1

,因爲你可能不希望鎖定整個數據庫表,這是相當做邪惡的事情,你可以與USERCOUNT位值的組表有一個字段,那麼你就可以跨越你的用戶表操作的交易和組表中的對應字段值的更新,並確保特定組的usercount不會低於1.因爲hibernate會自動獲取寫更新的鎖,所以你不必考慮手動鎖策略如此處所述:http://docs.jboss.org/hibernate/core/3.3/reference/en/html/transactions.html#transactions-locking

希望有幫助..