2013-09-23 51 views
0

我正面臨以下版本問題(樂觀鎖)。 版本檢查沒有發生,並且異常陳舊狀態當我使用下面的查詢時,不會引發異常。 用戶詳細信息和版本沒有正確遞增,但版本號不相等時不會引發異常。版本檢查不能與executeUpdate一起使用

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

這是預期的。談到JPA,批量更新不需要自動更新版本。在JPA 2.0規範中,這被告知如下:

批量更新直接映射到數據庫更新操作,繞過 樂觀鎖定檢查。如果需要,便攜式應用程序必須手動更新版本列的值 ,和/或手動驗證版本列的值。

版本可以在查詢中更新:

u.version = u.version + 1 

如休眠documentation說,有休眠特定的語法使用VERSIONED關鍵字來實現相同的:

在與EJB3保持規範,HQL UPDATE語句,默認爲 ,不影響第5.1.3.1節「版本號」或 第5.1.3.2節「時間戳」屬性值受影響的 實體。但是,您可以強制Hibernate通過使用版本化更新來重置版本或時間戳記屬性值。這個 是通過在UPDATE關鍵字後面添加VERSIONED關鍵字來實現的。

相關問題