環境:
私はそのUser
エンティティを持っています:
@Entity
public class User implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer userId;
@Version
@Temporal(TemporalType.TIMESTAMP)
@Column(name = "VERSION", length = 19)
private Date version;
@Column(nullable = false, length = 20)
private String login;
// Getters and Setters
}
ユーザーを一覧表示する検索ページがあり、ユーザーをクリックして編集します ( userId
URL に入力します)。
編集フォームでは、そのエンティティのフィールドをサーバーに保存し、ユーザーを保存するときにこれを行います。
User user = entityManager.find(User.class, userId)
user.setLogin(form.getLogin());
user.setVersion(form.getVersion());
user.setUserId(form.getUserId());
entityManager.merge(user);
質問:
したがって、Hibernate での楽観的ロックを正しく理解していれば、ブラウザーで 2 つのタブを開いて同じユーザーを編集し、最初のタブでログインを更新し、次に2 番目のタブでログインを更新すると、OptimisticLockException
?
実際、これは私のアプリケーションには当てはまりません...私は、2回目の更新で最初の編集によって更新されたform.getVersion()
としても、両方のケースで同じ値を返すことを確認しました。user.version
何か不足していますか?
EntityManager
が生成されます(したがって、マージしようとすると@RequestScoped
2 つの異なるにいます...)。EntityManager
私はentityManager.lock(user, LockModeType.OPTIMISTIC_FORCE_INCREMENT)
前にやろうとしましたentityManager.merge(...)
(ここで言ったように)が、助けにはなりませんでした。
JBoss 7.0.2.Final (Hibernate 4 を使用) で Seam 3 を使用しています。