我面临以下版本问题(乐观锁定)。 版本检查没有发生,异常陈旧状态当我使用下面的查询时,不会抛出异常。 用户详细信息和版本没有正确递增,但是当版本号不相等时,它不会抛出异常。
try{
Query query= getSessionFactory().getCurrentSession().createQuery("update versioned User u set u.userName=:userName,u.DOB=:DOB where u.userID= :id " );
query.setString("userName", usrName);
query.setString("DOB",dob);
query.executeUpdate()
getSessionFactory().getCurrentSession().flush();
}catch(StaleStateException e){
return "some msg return to notify user "
}
Same thing working fine if use below query.
try{
getSessionFactory().getCurrentSession().update(user);
getSessionFactory().getCurrentSession().flush();
}catch(StaleStateException e){
return "some msg return to notify user "
}
any suggestion in this regard will be much helpfull
答案 0 :(得分:1)
这是预期的。对于JPA来说,批量更新不需要自动更新版本。在JPA 2.0规范中,这被告知如下:
批量更新直接映射到数据库更新操作,绕过 乐观的锁定检查。便携式应用必须手动更新 如果需要,版本列的值和/或手动验证 版本列的值。
版本可以在查询中更新:
u.version = u.version + 1
正如在Hibernate documentation中所说,使用VERSIONED关键字可以实现Hibernate特定的语法:
与EJB3规范,HQL UPDATE语句保持一致 默认情况下,不影响第5.1.3.1节“版本号”或 第5.1.3.2节,受影响的“Timestamp”属性值 实体。但是,您可以强制Hibernate重置版本或 通过使用版本化更新的timestamp属性值。这个 通过在UPDATE关键字后添加VERSIONED关键字来实现。