gpt4 book ai didi

java - StaleObjectstateException 行被更新或删除

转载 作者:IT老高 更新时间:2023-10-28 13:54:04 26 4
gpt4 key购买 nike

我在使用 hibernate 的基于 Spring 框架的 Web 应用程序的 Controller 中遇到此异常。我尝试了很多方法来解决这个问题,但无法解决。

在 Controller 的方法 handleRequestInternal 中,对数据库的调用主要是为了“读取”,除非它是提交操作。我一直在使用 Spring 的 Session 但移至 getHibernateTemplate() 问题仍然存在。

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

1) getEquipmentsByNumber(number) { 首先根据“编号”从数据库中获取设备,该编号具有属性列表,每个属性都有值列表。我遍历这些值(原始对象字符串)以读入变量)

2) getMaterialById(id) {根据id获取 Material }

我确实理解第二次调用很可能是使 session “刷新”,但我只是在“读取”对象,那么为什么第二次调用会在 Equipment 属性上抛出过时的对象状态异常(如果存在)什么都没有改变?

调用后我无法清除缓存,因为它会导致我传递给 View 的对象出现 LazyExceptions。

我读过这个: https://forums.hibernate.org/viewtopic.php?f=1&t=996355&start=0但根据提供的建议无法解决问题。

我该如何解决这个问题?任何想法和想法都会受到赞赏。

更新:我刚刚测试的是,在函数 getEquipmentsByNumber() 从属性列表中读取变量后,我这样做: getHibernateTemplate().flush(); 现在异常(exception)是在这一行,而不是获取 Material 的调用(即 getMaterialById(id))。

更新:在显式调用刷新之前,我会从 session 缓存中删除对象,这样缓存中就不会保留陈旧的对象。

getHibernateTemplate().evict(equipment);
getHibernateTemplate().flush();

好的,所以现在问题已转移到我执行此操作后从 DB 获取的下一个问题。我想我必须将这些方法标记为同步并在我读完它们的内容后立即驱逐对象!听起来不太好。

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

最佳答案

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

这就是为什么调用 flush() 会引发异常。

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

另一种可能性:unsaved-value 对于“int”PK 字段默认为 0。如果您确实想将 0 用作有效的 PK 值,则可以将它们键入为“整数”。

第三个建议:明确使用 Hibernate Session,学习编写简单且正确的代码,然后加载 Hibernate/Spring 库的 Java 源代码,以便阅读和了解这些库的实际用途你。

关于java - StaleObjectstateException 行被更新或删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3158491/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com