我遇到一种情况,线程可以从数据库中检索对象并对其进行编辑,并且在刷新时会收到StaleObjectStateException,因为与此同时,另一个线程已经编辑了同一对象(Im使用乐观锁定)。我可以知道为什么会发生这种情况,但是我无法更改这种行为。
因此,我想做的是再次从数据库中检索对象,然后重新应用最新版本的更改,但是在进行检索之前,我什至还收到了另一个StaleObjectStateStateException,甚至还没有进行任何更改,这是为什么呢?
try{
songs = nextSongGroup.getSongs(session);
modifySongs(songs);
session.flush();
}
catch(StaleObjectStateException sobe){
songs = nextSongGroup.getSongs(session);
modifySongs(songs);
}
最佳答案
如果您遇到此异常,那就为时已晚。您需要放弃会议并获得一个新的会议。在同一会话上的任何查询都将导致相同的异常。
理论上调用em.clear();并重新运行相同的查询可能会有所帮助。我从来没有尝试过。
对我来说,我通常向用户显示一个Oops页面,该页面具有一个重试按钮,该按钮可以在干净的会话中再次运行其请求。