2012-06-21 73 views
0

我有一種情況,一個線程可以從數據庫中檢索一個對象,並對其進行編輯,並在刷新它時得到一個StaleObjectStateException,因爲在此期間另一個線程編輯了相同的對象(使用樂觀的Im鎖定)。我可以看到它爲什麼會發生,但我無法改變這種行爲。從StaleObjectStateException中恢復

所以我嘗試做的是從數據庫中再次檢索該對象並重新應用上的最新版本的變化,但我只要我做檢索之前,我甚至改變任何東西得到另一個 StaleObjectStateException,這是爲什麼這個 ?

try{ 
    songs = nextSongGroup.getSongs(session); 
    modifySongs(songs); 
    session.flush(); 
} 
catch(StaleObjectStateException sobe){ 
    songs = nextSongGroup.getSongs(session); 
    modifySongs(songs); 
} 

回答

1

如果你有這個例外,它已經太晚了。你需要扔掉會議,並得到一個新的。同一個會話中的任何查詢都會導致相同的異常。

理論上調用em.clear();並重新運行相同的查詢可能會有所幫助。我從來沒有嘗試過這一點。

對我來說,我通常會向用戶提供一個Oops頁面,該頁面有一個重試按鈕,可以在乾淨的會話中再次運行他的請求。

+1

Thankyou使用session.clear()適用於我 –

+0

很高興知道:)感謝您分享您的結果! – MahdeTo