2012-06-21 2 views
0

У меня возникла ситуация, когда поток может извлекать объект из db и редактировать его, а когда он скрыт, я получаю StaleObjectStateException, потому что в то же время другой поток редактировал один и тот же объект (Im using optimistic замок). Я вижу, почему это происходит, но я не могу изменить это поведение.Восстановление из 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 using session.clear() работает для меня –

+0

Замечательно :) Спасибо, что поделились своими результатами! – MahdeTo

Смежные вопросы