在这种情况下,线程可以从db检索对象,并对其进行编辑。在刷新对象时,我会得到一个StaleObjectStateException,因为在此期间,另一个线程已经编辑了相同的对象(我使用乐观锁定)。我明白为什么会发生这种情况,但我不能改变这种行为。
因此,我试图做的是再次从db检索对象,并在最新版本上重新应用更改,但是我在做检索之前就得到了另一个 StaleObjectStateException,为什么会这样呢?
try{
songs = nextSongGroup.getSongs(session);
modifySongs(songs);
session.flush();
}
catch(StaleObjectStateException sobe){
songs = nextSongGroup.getSongs(session);
modifySongs(songs);
}发布于 2012-06-21 11:35:23
如果你有这个例外,已经太迟了。你需要扔掉这段时间,换个新的。对同一会话的任何查询都将导致相同的异常。
理论上,调用em.clear();并重新运行相同的查询可能会有所帮助。不过我从来没试过这个。
对我来说,我通常向用户提供一个Oops页面,其中有一个retry按钮,在干净的会话中再次运行他的请求。
https://stackoverflow.com/questions/11137173
复制相似问题