我在使用hibernate的基于spring框架的Web应用程序的控制器中获得此异常.我已经尝试了很多方法来解决这个问题,但无法解决它.
在控制器的方法中,handleRequestInternal对数据库的调用主要是为了"读取",除非它是一个提交动作.我一直在使用,Spring的Session但是转移到getHibernateTemplate()了,问题仍然存在.
基本上,这对数据库的第二次调用会抛出此异常.那是:
1)getEquipmentsByNumber(number) {首先,基于'number'从DB获取设备,其具有属性列表,并且每个属性具有值列表.我循环遍历这些值(原始对象字符串)以读入变量)
2)getMaterialById(id){基于id获取材料}
我确实理解第二次调用很可能是使会话"刷新",但我只是"读取"对象,那么为什么第二次调用会在Equipment属性上抛出过时的对象状态异常,如果没有任何改变的话?
我无法在调用后清除缓存,因为它会导致我传递给视图的对象上的LazyExceptions.
我读过这个:https: //forums.hibernate.org/viewtopic.php?f = 1&t = 99635&start = 0 但根据提供的建议无法解决问题.
我该如何解决这个问题?任何想法和想法都表示赞赏.
更新:
我刚刚测试的是,在getEquipmentsByNumber()从属性列表中读取变量后的函数中,我这样做:getHibernateTemplate().flush();现在异常就在这一行而不是调用fetch材料(即getMaterialById(id)).
更新: 在显式调用flush之前,我从会话缓存中删除对象,以便缓存中没有过时的对象.
getHibernateTemplate().evict(equipment);
getHibernateTemplate().flush();
Run Code Online (Sandbox Code Playgroud)
好的,现在问题已经转移到我执行此操作后从DB中的下一次提取.我想我必须将方法标记为已同步,并在我阅读完内容后立即逐出对象!听起来不太好.
更新:
使handleRequestInternal方法"同步".错误消失了.当然,不是最好的解决方案,而是做什么!试图handleRequestInternal关闭当前会话并打开一个新会话.但它会导致应用程序的其他部分无法正常工作.试图使用ThreadLocal那也不起作用.
我有一个java应用程序,Spring框架,tomcat上的hibernate,基本上几乎没有安全性,除了登录和注销功能(没有弹簧安全性)
我可以通过以下方式访问控制器中的用户信息:
// where request is HttpServletRequest
HttpSession session = request.getSession(true);
SystemUser user = (SystemUser) session.getAttribute("user");
并做逻辑.但是,我需要在Dao层获取此信息.我实际从数据库中获取数据以检索用户特定数据的位置.一种方法是将"用户"对象传递给服务层,然后将服务层传递给dao层.但这是一项相当大的工作.
我想知道Spring中是否有一种方法可以访问Dao层中的会话对象?或以任何其他方式检索用户特定数据.