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