2011-01-06 76 views
1

我有做的應用程序:是否爲分離對象休眠默認的樂觀鎖定?

void deleteObj(id){ 
    MyObj obj = getObjById(id); 
    if (obj == null) { 
     throw new CustomException("doesn't exists"); 
    } 
    em.remove(obj);//em is a javax.persistence.EntityManager 
} 

我還沒有明確配置optimistic locking與版本field.However,如果兩個請求並行運行,試圖刪除同樣的對象,然後我得到有時是HibernateOptimisticLockingFailureException和其他時間的「CustomException」。

如果沒有顯式設置樂觀鎖定,是否正常獲取HibernateOptimisticLockingFailureException?是否爲分離對象休眠默認樂觀鎖定?

你在做什麼來處理這個HibernateOptimisticLockingFailureException?用「服務器忙」等默認信息重試或通知用戶?

回答

4

首先,HibernateOptimisticLockingFailureException是Spring持久化異常轉換機制的結果。它扔在應對StaleStateException,它的javadoc說:當一個版本號或時間戳檢查失敗,表明該會話包含陳舊的數據(使用長事務時使用的版本)

拋出。如果我們嘗試刪除或更新不存在的行,也會發生。

從常理來說,當數據修改語句返回受影響的行數意外出現樂觀鎖定異常。這可能是由於版本值不匹配以及根本不存在該行造成的。

要確保實體實際上刪除您可以嘗試通過em.flush()刷新上下文取出後馬上趕由它引發的異常(請注意,它應該是具有StaleStateException的一個原因PersistenceException子類)。

+0

tks! 「如果我們嘗試刪除或更新不存在的行,也會發生」,似乎這是我的情況。處理異常的好方法是什麼?重試 ?或者我應該發送一個默認消息,如「服務器忙」? – 2011-01-06 21:18:28