0

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

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
4

1 回答 1

1

这是意料之中的。对于 JPA,不需要批量更新即可自动更新版本。在 JPA 2.0 规范中,这被告知如下:

批量更新直接映射到数据库更新操作,绕过乐观锁定检查。如果需要,便携式应用程序必须手动更新版本列的值,和/或手动验证版本列的值。

版本可以在查询中更新:

u.version = u.version + 1 

正如 Hibernate文档中所述,通过使用 VERSIONED 关键字可以使用特定于 Hibernate 的语法来实现相同的目的:

为了与 EJB3 规范保持一致,默认情况下,HQL UPDATE 语句不会影响受影响实体的第 5.1.3.1 节“版本号”或第 5.1.3.2 节“时间戳”属性值。但是,您可以强制 Hibernate 通过使用版本更新来重置版本或时间戳属性值。这是通过在 UPDATE 关键字之后添加 VERSIONED 关键字来实现的。

于 2013-09-23T19:21:58.437 回答