5

こんにちは
、フィールドとして別のエンティティのセットを持つ休止状態のエンティティがあります。このようなもの:

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

少なくとも 1 人の 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

おそらくデータベース全体をロックしたくないので、これは非常に悪いことです。グループテーブルにユーザーカウント値を持つフィールドを作成し、トランザクションをユーザーテーブル操作と更新にまたがることができます。グループ テーブルの対応するフィールド値を調べ、特定のグループのユーザー数が 1 を下回らないようにします。hibernate は更新のために書き込みロックを自動的に取得するため、http://docs.jbossで説明されている手動ロック戦略について考える必要はありません。 .org/hibernate/core/3.3/reference/en/html/transactions.html#transactions-locking

それが役に立ったことを願っています..

于 2011-05-14T14:10:52.393 に答える