Hibernate (JPA):当多个对象被修改和提交时如何处理 StaleObjectStateException

2023-12-04

考虑以下场景: 一项数据库事务涉及不同表中的多个行并进行版本控制。

例如: 商店清单和产品。商店列表可能包含产品(及其在商店列表中的数量),并且产品具有当前库存。

当我插入或编辑 shopList 时,我希望更新 shopList 中这些产品的库存以保持库存一致。

为此,我打开一个事务,插入/更新 shopList,更新每个产品的库存(应用增量),然后提交事务。到现在为止还没什么大不了的。

然而,其他用户可能已经更新了一个或多个共同的产品。或者甚至更新了 shopList 本身。在这两种情况下,我在提交事务时都会收到 StaleObjectStateException。

问题是:有没有办法确定哪个表导致了 StaleObjectStateException?

如果产品导致异常,我可以从数据库刷新所有涉及的产品,然后重新应用库存增量。那很好。 如果 shopList 导致异常,最好将问题报告给用户,以便他可以重新开始。

非常感谢您的帮助。


我知道怎么做了。

首先要做的事情是: JPA(或 hibernate 本身)将 org.hibernate.StaleObjectStateException 异常包装为 javax.persistence.OptimisticLockException。 因此,如果您想捕获正确的异常,请使用 OptimisticLockException。

第二: 只有在提交之前调用 EntityManager 的 Flush 方法时,hibernate 才会抛出 OptimisticLockException。如果你直接调用 Commit,你会得到另一个异常(我忘了是哪个)。考虑到几乎每个人都会捕获提交方法发出的异常并进行事务回滚,您将得到回滚相关的异常(再次记不清是哪个异常)。

第三次也是最后一次回答我原来的问题: 您只需从 OptimisticLockException 实例调用 getEntity 方法即可获取版本控制错误的来源。这将为您提供与此相关的任何您需要的东西。

感谢所有路过这里的人。 如有任何疑问,请提出,我很乐意提供帮助。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Hibernate (JPA):当多个对象被修改和提交时如何处理 StaleObjectStateException 的相关文章

随机推荐

  • 如何使用 PHP Bitly v4 缩短 URL?

    我有 Bitly 的代码v3并且运行良好
  • RedirectToAction 不是重定向

    这不应该起作用吗 如果我最后有一个断点 它停在那里 但永远不会到达ContactAction 发布后的页面只是一个空白页面 没有源代码 我错过了什么 谢谢 您的联系人 ContactModel 模型 不应为 void 而应为 public
  • 如何将数据从应用程序发送到AppWidgetProvider?

    我陷入了一个特定的场景 用户从应用程序更新时间后 我需要立即更新我的小部件 我确实尝试通过 Intent Extras 发送数据来进行广播 但失败了 目前 我的数据在AppWidgetProvider我需要将此数据发送到服务 public
  • 更改 LISP 中列表的副本

    在 LISP 中 我有一个传递列表的函数 我想更改此列表的元素而不更改原始列表 通常情况下 我会使用copy list创建我将更改的列表的本地副本 但这似乎不起作用 CL USER gt defun test item let copy c
  • Azure DevOps 多阶段管道陷入等待批准状态

    我将托管的 Azure DevOps 与 Azure Git Repos 中的代码一起使用 我们曾经使用 经典 的基于 UI 的管道编辑器 但在构建 发布阶段正在转向 YAML 模板 过去 我配置了 CI CD 以便当代码通过拉取请求提交到
  • 类型“List”不是类型“List”的子类型

    我有一段从 Firestore 示例中复制的代码片段 Widget buildBody BuildContext context return new StreamBuilder stream getEventStream builder
  • 更新 Entity Framework 6 中的子对象

    使用实体框架6 2 我有以下两个模型 实体 public class City public int CityId get set public string Name get set public class Country public
  • Rails 如何获得最佳性能请求并行 sidekiq 工作线程

    我的 Rails 应用程序有一名 sidekiq 工作人员 该工作线程将向外部 api 发出 2500 个请求 响应是一个 xml 如何让该员工获得最佳绩效 在工作线程内部 生成应用程序级线程 例如 创建 10 个 ruby 线程来处理 2
  • 如何用 Python 编写与 Wikipedia 中的示例不同的策略模式?

    在 2009 年策略模式的维基百科条目中 有一个例子用 PHP 编写 大多数其他代码示例都会执行以下操作 a Context new StrategyA new a execute gt Doing the task the normal
  • 在 JavaScript 中检查字母数字的最佳方法

    对文件执行字母数字检查的最佳方法是什么INPUT领域在JSP 我已附上我当前的代码 function validateCode var TCode document getElementById TCode value for var i
  • Form_Load() '事件' 或覆盖 OnLoad()

    我希望有人尝试解释它们之间的区别 更具体地说 是示例使用场景 我正在重构一些窗口窗体代码和一个Form有一些代码在Form Load 事件并且也在protected override void OnLoad 调用的事件base OnLoad
  • @Dependent 范围在 Wildfly 中不是默认的吗?

    我在使用 Wildfly 通过 Inject 注入 POJO 时遇到一些麻烦 文档明确指出 Dependent 如果未指定 则默认范围 这意味着一个对象的存在只是为一个客户端 bean 提供服务 并且与该客户端 bean 具有相同的生命周期
  • 如何在Python线程中使用qtwebkit?

    我正在尝试使用 qtwebkit 解析 js 生成的网页 我找到了如何获取页面源的示例 import sys from PySide QtGui import from PySide QtCore import from PySide Qt
  • 如何测试更新方法?

    我是单元测试新手 并在我的 Java Spring Boot 应用程序中使用 JUnit 我有时需要测试更新方法 但是当我在网上搜索时 没有合适的示例或建议 那么 您能否澄清一下如何测试以下更新方法 我认为这可能需要与测试 void 不同的
  • 如何使用 beautifulsoup 打印 href 属性,同时通过 selenium 实现自动化?

    蓝色元素的 href 值是我想从此 HTML 访问的内容 我尝试了几种方法来打印链接 但没有成功 我的代码如下 discover page BeautifulSoup r text html parser finding accounts
  • 运行react-native run-android时出错

    https facebook github io react native docs getting started html I have followed the instruction that are on this link Bu
  • 在 Prolog 中对列表进行分区

    我正在尝试创建一个 Prolog 谓词 其中给定一个列表 可以看出该列表是否可以分为两个总和相同的列表 我有一个工作列表总和谓词 因此我在分区谓词中使用它 我首先尝试对谓词进行编码 以查看列表的第一个元素是否等于列表其余部分的总和 2 1
  • 通过 Office 365 REST API 标记消息?

    我正在寻找一种使用 Office 365 REST 消息 API 检测和设置电子邮件的 标记 状态的方法 我没有看到 Flag 被列为某个属性休息消息 尽管我确实看到它列在下面交换网络服务 我尝试进行 REST 调用 将 Flag 添加到筛
  • 如何在 Windows 窗体 C# 中执行代码时显示动画加载窗体

    我想在主窗体中执行一些代码时显示动画加载窗体 动画表单仅用于向用户显示操作正在执行 我想在操作完成后关闭它 我正在使用的代码是 public partial class Form main admin Form private Thread
  • Hibernate (JPA):当多个对象被修改和提交时如何处理 StaleObjectStateException

    考虑以下场景 一项数据库事务涉及不同表中的多个行并进行版本控制 例如 商店清单和产品 商店列表可能包含产品 及其在商店列表中的数量 并且产品具有当前库存 当我插入或编辑 shopList 时 我希望更新 shopList 中这些产品的库存以