如何在Hibernate中执行原子操作?

Ham*_*zeh 5 hibernate transactional

嗨,
我有一个hibernate实体,它有一组另一个实体作为其字段.像这样的东西:

public class UserEntity implements Srializable {
    private Set<Role> roles;
}
Run Code Online (Sandbox Code Playgroud)

我应该以一种方式保留表,即系统中始终存在至少一个ADMIN用户.这可以通过简单的方式完成,如下所示:

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

但是当我们进行并发操作时会发生真正的问题.如何以原子方式执行所有操作?
谢谢,
HM

fas*_*seg 1

因为您可能不想锁定整个数据库表,这是一件非常邪恶的事情,所以您可以在组表中拥有一个带有 usercount 值的字段,然后您可以将事务跨越用户表操作和更新组表中相应的字段值,并确保特定组的用户计数不低于 1。由于 hibernate 自动获取更新的写锁,因此您不必考虑手动锁定策略,如下所述:http://docs.jboss .org/hibernate/core/3.3/reference/en/html/transactions.html#transactions-locking

希望有帮助..