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

时间:2011-05-14 12:57:45

标签: hibernate transactional

您好
我有一个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 个答案:

答案 0 :(得分:1)

因为你可能不想锁定一个完整的数据库表,这是一个非常邪恶的事情,你可以在你的组表中有一个带有usercount值的字段,然后你可以跨越用户表操作和更新组表中相应的字段值,并确保特定组的用户数不会低于1.因为hibernate会自动获取更新的写锁,您不必考虑手动锁定策略,如下所述:{{3} }

希望有所帮助..