StaleObjectstateException行已更新或删除

Sak*_*aky 16 java spring hibernate exception staleobjectstate

我在使用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那也不起作用.

Tho*_*s W 6

你以某种方式误用Hibernate导致它认为你正在更新删除数据库中的对象.

这就是调用flush()抛出异常的原因.

一种可能性: 您通过servlet或控制器的成员字段错误地"共享"会话或实体.这是'同步'会改变你的错误症状的主要原因.简短的解决方案:不要这样做.会话和实体不应该以这种方式工作 - 每个请求都应该独立处理.

另一种可能性: unsaved-value"int"PK字段默认为0.如果您真的想使用0作为有效的PK值,您可以将它们键入为"整数".

第三个建议: 明确使用Hibernate Session,学习编写简单正确的代码,然后加载Hibernate/Spring库的Java源码,这样你就可以阅读并理解这些库实际上为你做了些什么.


wal*_*mon 1

这个问题是我经历过的并且非常令人沮丧,尽管在您的 DAO/Hibernate 调用中一定会发生一些奇怪的事情,因为如果您通过 ID 进行查找,则没有理由获得陈旧状态,因为这只是对象的简单查找。

首先,确保所有方法都带有注释@Transaction(required=true) // you'll have to look up the exact syntax

但是,当您尝试对已从检索该对象的会话分离的对象进行更改时,通常会引发此异常。解决这个问题的方法通常并不简单,需要发布更多代码,以便我们能够准确地看到发生了什么;我的一般建议是创建一个@Service在单个事务中执行这些事情的