Tag: staleobjectstate

StaleObjectstateException行已更新或删除

我在使用hibernate的基于spring框架的Web应用程序的控制器中获得此exception。 我已经尝试了很多方法来解决这个问题,但无法解决它。 在控制器的方法handleRequestInternal ,对数据库进行的调用主要是为了“读取”,除非它是一个提交动作。 我一直在使用,Spring的Session但是转移到getHibernateTemplate()并且问题仍然存在。 基本上,这是对数据库的第二次调用抛出此exception。 那是: 1) getEquipmentsByNumber(number) {首先,根据’number’从DB中提取设备,其中包含属性列表,每个属性都有一个值列表。 我遍历这些值(原始对象字符串)以读入变量) 2) getMaterialById(id) {基于id获取材料} 我确实理解第二次调用很可能是使会话“刷新”,但我只是“读取”对象,那么为什么第二次调用会在Equipment属性上抛出过时的对象状态exception,如果没有任何改变的话? 我无法在调用后清除缓存,因为它会导致我传递给视图的对象上的LazyExceptions。 我已经读过这个: https : //forums.hibernate.org/viewtopic.php?f = 1&t = 996355&start = 0但根据提供的建议无法解决问题。 我该如何解决这个问题? 任何想法和想法都表示赞赏。 更新:我刚刚测试的是,在从属性列表中读取变量之后,在函数getEquipmentsByNumber() ,我这样做: getHibernateTemplate().flush(); 现在exception就在这一行而不是调用fetch材料(即getMaterialById(id) )。 更新:在显式调用flush之前,我从会话缓存中删除对象,以便缓存中没有过时的对象。 getHibernateTemplate().evict(equipment); getHibernateTemplate().flush(); 好的,现在问题已经转移到我执行此操作后从DB中的下一次提取。 我想我必须将这些方法标记为已同步,并在我阅读完内容后立即逐出对象! 听起来不太好。 更新:使handleRequestInternal方法“同步”。 错误消失了。 当然,不是最好的解决方案,而是做什么! 试着在handleRequestInternal中关闭当前会话并打开一个新会话。 但它会导致应用程序的其他部分无法正常工作。 试图使用不起作用的ThreadLocal 。