环境:
我有那个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 个选项卡来编辑同一个用户,然后更新第一个选项卡上的登录名,然后更新第二个选项卡上的登录名,我应该有一个OptimisticLockException
不应该?
实际上,我的应用程序不是这种情况......我验证了,form.getVersion()
在两种情况下都返回相同的值,即使在第二次更新中,user.version
第一次编辑已经更新了。
我错过了什么吗?
EntityManager
产生了@RequestScoped
(所以当我尝试合并时我在两个不同的EntityManager
s 上......)。
我之前尝试entityManager.lock(user, LockModeType.OPTIMISTIC_FORCE_INCREMENT)
过entityManager.merge(...)
(如此处所述),但没有帮助。
我正在使用 Seam 3 和 JBoss 7.0.2.Final(它使用 Hibernate 4)。