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