问题标签 [staleobjectstate]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
1450 浏览

java - 刷新对象后的 StaleObjectStateException

当我尝试提交我的会话并且另一个用户也更改了同一个对象时,Hibernate 会抛出一个StaleObjectStateException.

当我尝试从该异常中恢复时,我调用:

session.refresh(<staleObject>)

然后我再次调用之前失败的提交。但是在staleObjectStateException同一个物体上再次发生。即使其他用户没有进行任何更改,我也验证了对象的版本号与我们数据库中的版本号相同。

有谁知道可能出了什么问题?有没有人对如何在不关闭和打开新会话的情况下优雅地处理异常有更好的想法?

注意:我们为我们的桌面 (RCP) 应用程序使用每个视图的单个会话实现

0 投票
2 回答
430 浏览

winforms - 使用 NHibernate 处理 Winforms 中的约束冲突

我想处理用户在 Windows 窗体应用程序中从数据库编辑对象,进行违反数据库约束(即列唯一值)的编辑,将实体保存回数据库,NHibernate 抛出的情况一个例外,从而破坏了会话。

我正在使用 MSDN 文章使用 NHibernate 构建桌面待办事项应用程序中发布的指南,并使用每个演示者/表单的会话方法。在创建演示者时,我保留对 SessionFactory 的引用,创建一个新会话,通过会话从数据库中检索对象并存储对它的引用 [对象]。显示表单时,其字段由对象填充。

当对表单进行更改并且用户希望保存数据时,从字段值更新对象,并将对象保存回数据库。

我处理过时状态异常,其中对象在从数据库检索到它被保存回来的时间之间发生了更改:创建一个新会话,再次加载原始对象,通知用户发生了冲突,并且显示他的更改以及数据库中当前的内容。他可以选择保存他的更改或取消(并接受现在存储在数据库中的内容)。

在违反约束的情况下,似乎会发生以下两种情况之一:

  1. 该对象在数据库中没有更改,可以将其重新加载到新会话中。
  2. 该对象在数据库中也已更改,不再反映最初加载的内容。

但是,我认为我实际上无法检测到发生了哪种情况,因为由于发生了约束异常(我已经对此进行了测试),所以永远不会抛出陈旧状态异常。

处理案例 1 是微不足道的,因为我可以简单地显示一条错误消息,上面写着“FIELD-X 的值已经在数据库中”,并假装没有发生任何真正糟糕的事情。用户可以将 FIELD-X 更改为唯一值并再次保存,而无需重新输入更改。

处理案例 2 就像处理常规的陈旧状态异常。

我知道我可以通过保留原始副本(或其值)然后逐个字段比较这两个来“蛮力”这一点。但是,我怀疑有更好的方法来利用 NHibernate 来处理这个问题。 你会怎么处理这个?

如果有帮助:

  • NHibernate 版本:3.2
  • 使用“脏”策略的乐观锁定
  • .NET 框架 2.0 SP2
  • SQLite 数据库/驱动程序

编辑 2 月 23 日 - 我添加了一些示例代码以更好地说明我目前在做什么。

0 投票
2 回答
5024 浏览

hibernate - Hibernate/JPA @Version 和 @Generated 导致 StaleObjectStateException

使用 Hibernate 4.1.0 提供的 Spring 3.1/JPA 2。

我的所有实体都有一个基类,它提供基本的审计功能(更新时间戳、版本号等)。因为其他应用程序访问我们的数据库,这些必须通过触发器设置。

我的映射看起来像:

提交事务时始终调用该org.hibernate.engine.internal.increment(...)方法 - 并导致StaleObjectStateException.

奇怪的是,如果我GenerationTime.NEVER在版本列上设置,休眠仍然会增加版本,但会正确保留。问题是即使数据库中的版本没有更新(例如,表上没有更改),从合并返回的版本也会比数据库值高 1,这显然会导致后续保存出现问题。

我的期望是GenerationTime.ALWAYS告诉hibernate永远不要尝试增加版本并依赖数据库来这样做,然后在插入/更新之后选择更新的值。

谁能告诉我我的理解和实施哪里出了问题?

0 投票
1 回答
2753 浏览

c# - NHibernate,为什么在删除后加载实体会导致陈旧状态异常?

我有一个正在批量处理的 Item 实体列表,如下所示:

问题是,同一个 itemId 可能会在 ItemIdList 中列出多次,所以删除后,我再次尝试加载该项目,加载行失败并出现错误

我知道实体不再存在,但我希望我的 get 函数只返回 null。这是我的 getById 函数:

为什么SingleOrDefault不只返回 null?

我的 Item 实体只有一个自动生成的键,哈希函数如下所示:

编辑:

这是我的删除方法

0 投票
1 回答
646 浏览

java - 为什么我的 ListView 方法会引发“陈旧对象状态”异常?

目前在我的应用程序中,当我调用从我的数据库中更新 ListView 的方法时,我遇到了一个过时的对象异常。

在查询我的数据库时,我一直小心地关闭所有游标,当通过使用“startManagingCursor”返回游标时,我也管理我的游标,但我仍然遇到这个问题。

目前,当我向我的数据库添加一个新项目时,我想起了我类的私有方法中的 ListView 更新方法。这是对象抛出异常的地方。

我读过人们“刷新”会话,而且我相信数据库版本会出现这种情况?但总的来说,我被卡住了,无法解决这个问题。

更新错误:

02-13 13:23:06.588: E/AndroidRuntime(287): 致命异常: main 02-13 13:23:06.588: E/AndroidRuntime(287): android.database.StaleDataException: 访问关闭游标 02-13 13: 23:06.588: E/AndroidRuntime(287): 在 android.database.AbstractWindowedCursor.checkPosition(AbstractWindowedCursor.java:217) 02-13 13:23:06.588: E/AndroidRuntime(287): 在 android.database.AbstractWindowedCursor.getInt (AbstractWindowedCursor.java:84) 02-13 13:23:06.588: E/AndroidRuntime(287): at com.example.flybase2.ShoppingList.updateTotal(ShoppingList.java:248) 02-13 13:23:06.588: E /AndroidRuntime(287): 在 com.example.flybase2.ShoppingList.access$1(ShoppingList.java:231) 02-13 13:23:06.588: E/AndroidRuntime(287): 在 com.example.flybase2.ShoppingList$2。 onClick(ShoppingList.java:350) 02-13 13:23:06.588: E/AndroidRuntime(287): at com.android。internal.app.AlertController$ButtonHandler.handleMessage(AlertController.java:158) 02-13 13:23:06.588: E/AndroidRuntime(287): at android.os.Handler.dispatchMessage(Handler.java:99) 02-13 13:23:06.588: E/AndroidRuntime(287): 在 android.os.Looper.loop(Looper.java:123) 02-13 13:23:06.588: E/AndroidRuntime(287): 在 android.app.ActivityThread .main(ActivityThread.java:4627) 02-13 13:23:06.588: E/AndroidRuntime(287): at java.lang.reflect.Method.invokeNative(Native Method) 02-13 13:23:06.588: E/ AndroidRuntime(287): at java.lang.reflect.Method.invoke(Method.java:521) 02-13 13:23:06.588: E/AndroidRuntime(287): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller .run(ZygoteInit.java:868) 02-13 13:23:06.588: E/AndroidRuntime(287): 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626) 02-13 13:23 :06.588:E/AndroidRuntime(287): 在 dalvik.system.NativeStart.main(Native Method)

这是我调用 ListView 的类:

这是从数据库返回的游标:

0 投票
1 回答
106 浏览

hibernate - StaleObjectException,但真的很奇怪

我继承了一个应用程序,它执行一些基于触发器的插入和更新,偶尔会抛出 StaleObjectException。我尝试添加很多调试(tx、hibernate、type 等),这让我更加困惑。

我在日志、休眠插入和数据中看到了 tx 提交,并且确实将具有 id #290595 的对象绑定为值。15:24:00 有类似的插入,但直到 15:25:00 应用程序完全静默(没有用户,没有其他活动)。

数据库中的 sql 查询显示记录 #290595 实际上不存在。插入和失败之间有 4 分钟。不用说,这通常在一天中的大部分时间都有效,但突然之间......

休眠不会在事务提交时自动刷新和提交吗?

我假设插入已将数据移动到缓存而不是数据库,在缓存中再次找到,但拒绝更新,因为它们不在数据库中。所以问题是真的有人有什么好主意吗?

它是一个 oracle 数据库,我试图确保 T2 具有Required_new 事务,并且对isolation_level 进行了序列化,但效果不大。我开始认为插入以某种方式未提交,?!

欢迎任何建议

0 投票
3 回答
7282 浏览

groovy - Geb 的一般问题(StaleElementReferenceException 和等待超时)

根据“Geb 之书”,我开始绘制我们门户网站的网页。我更喜欢使用在静态内容闭包块中定义的变量,然后在页面方法中访问它们:

不幸的是,有时我会收到 Geb 等待超时异常(60 秒后),或者更糟糕的是,我会收到众所周知的“StaleElementReferenceException”。

使用“isEnabled”而不是“isDisplayed”时,我可以避免等待超时,但对于“StaleElementReferenceException”,我只能应用以下解决方案:

我想,这个解决方案不是很好,但我无法应用另一篇文章中描述的显式等待。因此,我有一些一般性问题:

  • 当页面是动态的时,我应该避免使用静态内容定义吗?
  • Geb 在什么时间或事件刷新其 DOM?如何触发 DOM 刷新?
  • 为什么在使用 CSS 选择器时仍然会收到“StaleElementReferenceException”?

我将不胜感激每一个有助于理解或解决这个问题的提示。最好有一个简单的代码示例,因为我还是个初学者。谢谢!

0 投票
1 回答
227 浏览

hibernate - Grails StaleObjectException 与动态查找器(休眠)

我有一个批处理作业,它始终在动态查找器上抛出过时的对象异常。理想情况下,我不会为这项工作运行 ORM 解决方案,但我别无选择。异常发生在从 FormulaBatchPopulatorService 调用的 FormulaTagService 中。此应用程序正在使用一个数据库的两台服务器上运行。一台服务器只执行批处理。

我的问题是:a) 为什么一个简单的 select 语句会导致在给定事务期间没有对对象进行任何更改的域对象实例最终会保留在会话中,从而导致过时的对象异常?b) 是否有可能在事务结束时保留对 formula.tags 进行的排序,从而如果其他人在不同的服务器上修改公式,则会导致 staleobjectexception?

请注意,我确实将服务更改为只读,但我仍然收到过时对象异常。任何帮助将不胜感激。

公式标签服务

FormulaBatchPopulatorService Snippet

0 投票
1 回答
610 浏览

ajax - grails ajax 调用 row-was-updated-or-deleted-by-another-transaction-or-unsaved-value-mapping-was

我正在使用 Grails 2.3.5,并且我有一个包含ajaxDelete方法的控制器。此方法接收名称作为我要删除的实体的字符串。我正在使用一项服务来删除我从控制器中调用的实体。

第一次调用服务deleteSvnUser方法时,SVN 用户被删除,并且我在页面上的 div 更新,并显示用户已被删除的警报。第二次删除用户时,出现以下错误:

我已经尝试了几件事来解决这个问题:

  • 将@transactional 注释添加到我的服务中(我不应该这样做,因为它应该是默认的事务性的)。
  • 刷新我的删除(刷新:真)
  • 在我删除实体之前刷新它(.refresh)
  • 检索实体时锁定实体 (entity.lock(id))

以上都没有奏效。我不确定还能做些什么来解决这个问题。任何人都可以帮忙吗?我的代码如下:

控制器

服务

堆栈跟踪如下:

0 投票
3 回答
23630 浏览

hibernate - 如何使用 JPA 和 Hibernate 修复 StaleObjectStateException

控制器逻辑:

服务逻辑

发生什么了

在 90% 的情况下,这将起作用。

问题

我已经阅读了相关问题,并找到了merge您在上面看到的电话。它解决了大约 50% 的案例,但不是全部。