【发布时间】:2012-02-28 02:06:45
【问题描述】:
环境:
我有那个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 个选项卡来编辑同一个用户,然后更新第一个选项卡上的登录,然后 然后 在第二个选项卡上登录,我应该有一个 OptimisticLockException 不是吗?
实际上,我的应用程序不是这种情况...我验证,form.getVersion() 在两种情况下都返回相同的值,即使在第二次更新中,user.version 已在第一次编辑时更新.
我错过了什么吗?
EntityManager 产生 @RequestScoped(所以当我尝试合并时,我在两个不同的 EntityManagers 上......)。
我尝试在entityManager.merge(...) (as said here) 之前执行entityManager.lock(user, LockModeType.OPTIMISTIC_FORCE_INCREMENT),但没有帮助。
我正在使用 Seam 3 和 JBoss 7.0.2.Final(它使用 Hibernate 4)。
【问题讨论】:
-
您确定 entityManager 已刷新(或事务已提交)?生成的 SQL 更新查询是什么?
-
是的,使用 activation of Hibernate SQL dumping 我可以看到 SQL 更新和 JDBC
version字段绑定,这与我在 @987654338 中的User中设置的version不对应@...我开发了一个FlushInterceptor,它在我的update函数存在后调用,它执行entityManager.flush()。
标签: hibernate jpa-2.0 optimistic-locking jboss7.x