環境:
私はその 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
}
私はユーザーをリストする検索ページを持っています。ユーザーをクリックして編集します(URLに userId
を付ける)。
編集フォームでは、サーバー上にそのエンティティのフィールドを保存します。ユーザーを保存するときは、次の操作を行います。
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
をしてはいけませんか?
実際には、これは私のアプリケーションではそうではありません...私は検証しましたが、 form.getVersion()
は、2番目の更新でも user .version
は最初の編集で更新されました。
何か不足していますか?
EntityManager
は、 @RequestScoped
で生成されます(マージしようとすると、2つの異なる EntityManager
です)。
entityManager.merge(...)
( entityManager.lock(user、LockModeType.OPTIMISTIC_FORCE_INCREMENT)それは助けにはなりませんでした。
Seam 3をJBoss 7.0.2.Final(これはHibernate 4を使用しています)で使用しています。