5


,我有一个休眠实体,它有一组另一个实体作为其字段。像这样的东西:

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

4

1 回答 1

1

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

希望有帮助..

于 2011-05-14T14:10:52.393 回答