1

問題:

2 人の管理者 -> Admin1 と Admin2 異なる端末から同時に UserA を変更します。

User エンティティと UserGroup エンティティの間には対多の関係があります。

ここで、Admin1 が Group1 を UserA に割り当てると、情報が保存されます。また、別の端末の Admin2 が Group2 を UserA に割り当てると、情報は保存されますが、Admin1 が行った変更は上書きされます。DB をチェックインすると、UserA は Group2 に割り当てられますが、Admin2 は Admin1 による変更を認識していません。

  1. これは楽観的な状況ですか?
  2. これが楽観的な状況である場合、OptimisticLockException がスローされないのはなぜですか?
  3. Admin1 が行った変更を Admin2 に通知するにはどうすればよいですか。

以下のように Eclipselink を使用します。

    @ManyToMany
    @JoinTable(name = "user_group", joinColumns = { @JoinColumn(name = "user_group_id", referencedColumnName = "id") }, inverseJoinColumns = { @JoinColumn(name = "user_id", referencedColumnName = "id") })
    private List<User> userList;

    @ManyToMany
    @JoinTable(name = "user_group",joinColumns = { @JoinColumn(name = "user_id", referencedColumnName = "id") }, inverseJoinColumns = { @JoinColumn(name = "user_group_id", referencedColumnName = "id") })
    private List<UserGroup> userGroupList;

@Version アノテーションは、各操作で更新されるバージョン列にマークされます。

私の側からさらに情報が必要な場合はお知らせください。

4

1 に答える 1

0

group1 が user1 に割り当てられると、最終変更のタイムスタンプが保存されます。次回 user1 の詳細を取得するリクエストが来たときは、最終更新日とその他の詳細を必ず指定してください。admin1 が要求を変更するときは、get 操作中に指定したのと同じ最終変更日を提供するように依頼します。requestrequest を保存する前に、admin1 に提供したものと同じ最終更新日を比較します。基本的にここでの最終更新日は一種のトークンです。トークンを保存し、データにアクセスするユーザーに同じトークンを提供し、ユーザーがデータを変更して永続化操作のために送信するときに、データベース内のトークンがユーザーが返信したものと一致することを確認します。それ以外の場合は、レコードが変更されたことを意味します。トークンはデータベースで変更され、ユーザーが不正なデータを保持することを許可しません。

お役に立てれば。

于 2013-10-06T19:11:13.100 に答える