版本检查不使用executeUpdate

时间:2013-09-23 07:02:52

标签: hibernate

我面临以下版本问题(乐观锁定)。     版本检查没有发生,异常陈旧状态当我使用下面的查询时,不会抛出异常。     用户详细信息和版本没有正确递增,但是当版本号不相等时,它不会抛出异常。

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

1 个答案:

答案 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关键字来实现。