Java StaleObjectstateException行已由更新或删除

Java StaleObjectstateException行已由更新或删除,java,hibernate,spring,exception,staleobjectstate,Java,Hibernate,Spring,Exception,Staleobjectstate,我在使用hibernate的基于spring框架的web应用程序的控制器中遇到了这个异常。我尝试了很多方法来解决这个问题,但都无法解决 在控制器的方法中,handleRequestInternal,对数据库的调用主要是为了“读取”,除非是提交操作。 我一直在使用Spring的会话,但是转到了getHibernateTemplate(),问题仍然存在 基本上,这是对数据库的第二次调用引发的异常。即: 1) getEquipmentsByNumber(number){首先,根据“number”从数据

我在使用hibernate的基于spring框架的web应用程序的控制器中遇到了这个异常。我尝试了很多方法来解决这个问题,但都无法解决

在控制器的方法中,
handleRequestInternal
,对数据库的调用主要是为了“读取”,除非是提交操作。 我一直在使用Spring的会话,但是转到了
getHibernateTemplate()
,问题仍然存在

基本上,这是对数据库的第二次调用引发的异常。即:

1)
getEquipmentsByNumber(number)
{首先,根据“number”从数据库中提取设备,其中有一个属性列表,每个属性都有一个值列表。我循环这些值(基本对象字符串)以读入变量)

2)
getMaterialById(id)
{基于id获取材料}

我知道第二个调用很可能使会话“刷新”,但我只是“读取”对象,那么,如果没有任何更改,为什么第二个调用会在设备属性上抛出stale对象状态异常

我无法在调用后清除缓存,因为它会导致传递给视图的对象出现懒散异常

我读过: 但无法根据提供的建议解决问题

我怎样才能解决这个问题?任何想法和想法都将受到赞赏

更新: 我刚才测试的是,在函数
getEquipmentsByNumber()
中,在从属性列表中读取变量后,我执行以下操作:
getHibernateTemplate().flush();
现在异常在此行,而不是调用fetch material(即
getMaterialById(id)

更新: 在显式调用flush之前,我将从会话缓存中删除对象,以便缓存中不会保留过时的对象

getHibernateTemplate().evict(equipment);
getHibernateTemplate().flush();
好的,现在问题已经转移到我执行此操作后的下一次从DB获取。我想我必须将方法标记为已同步,并在读取完对象的内容后立即将其逐出!听起来不是很好

更新: 使
handleRequestInternal
方法“同步”。错误消失了。当然,这不是最好的解决方案,但该怎么办!
尝试在
HandlerRequestInternal
中关闭当前会话并打开一个新会话。但这会导致应用程序的其他部分无法正常工作。尝试使用
ThreadLocal
也无法正常工作。

这个问题是我遇到过的,非常令人沮丧,尽管肯定有一些问题DAO/Hibernate调用中出现了一些奇怪的情况,因为如果按ID进行查找,就没有理由得到过时状态,因为这只是对对象的简单查找

首先,确保所有方法都用
@Transaction(required=true)//注释//您必须查找确切的语法

但是,当您尝试对已从其检索的会话中分离的对象进行更改时,通常会引发此异常。解决此问题的方法通常并不简单,需要发布更多代码,以便我们能够准确地看到正在发生的情况;我的一般建议是创建一个执行此操作的
@Service
单个事务中的se类事务有3种可能性(我不知道具体使用哪种hibernate会话处理)。依次添加并测试:

在父对象和子对象之间使用双向映射,并使用
inverse=true
,这样父对象或子对象中的更改将正确地传播到关系的另一端

使用
TimeStamp
Version
列添加对乐观锁定的支持

使用连接查询一起获取整个对象图[parent+children],以避免第二次调用

最后,当且仅当什么都不起作用时: 通过
Id
(您已经有了)再次加载父级,并填充修改后的数据,然后更新


生活会很好的!:)

我也一直在努力解决这个异常,但当它继续出现时,即使我在对象上加了锁(在测试环境中,我知道我是唯一接触对象的进程),我决定适当考虑堆栈中的附加跟踪

org.hibernate.StaleObjectStateException:行已由更新或删除 另一个事务(或未保存的值映射不正确): [com.rc.model.mexp.MerchantAccount#59132]

在我们的例子中,结果证明映射是错误的;我们有
type=“text”
在一个字段的映射中,该字段是数据库中的mediumtext类型,Hibernate似乎真的讨厌它,至少在某些情况下是这样。我们从该字段的映射中完全删除了类型规范,问题得到了解决


现在奇怪的是,在我们的生产环境中,假设存在问题的映射,我们没有得到这个异常。有人知道为什么会出现这种情况吗?我们使用的是同一版本的MySQL—“5.0.22-log”(我不知道“-log”是什么意思)-在开发和生产环境中。

您以某种方式错误地使用了Hibernate,使其认为您正在更新或删除数据库中的对象

这就是调用
flush()
会引发异常的原因

一种可能性:您通过成员字段错误地“共享”了会话或实体这是“已同步”将更改错误症状的主要原因。简短的解决方案:永远不要这样做。会话和实体不应以这种方式工作-每个请求都应独立处理

另一种可能性:
未保存