java - 具有扩展实体管理器或同步点(多次提交)的 Quarkus 应用程序
问题描述
我正在编写一个 Quarkus 应用程序来处理需要分阶段提交的非常复杂的请求。基本上(在同一请求范围内)需要完成一些初始工作并记录请求 - 然后是更多必须记录的工作,以及更多必须记录的工作。最后请求结束并提交最后的工作。
当前解决方案使用 @Transactional 方法进行更新。这样可行。对于每个方法调用,更改都会保存并提交到数据库。问题是它效率低下。
从功能上讲,JPA 实体实际上是从请求开始到请求结束。在整个请求期间对相同的对象进行轻微修改,并且使用现有代码,每次更改都需要一个merge
,它在应用更新之前刷新数据库中的实体(或真正的实体图)。或者,更改可以使用带有更新的 JPA 查询,但这很麻烦并且需要大量脆弱的代码。
我已经尝试过使用特定于 Hibernate 的update
方法作为 的替代方法merge
,但是虽然它可能适用于简单的实体,但它会对集合(@ElementCollection、@OneToMany)造成严重破坏。手动 JPA 更新查询效果更好。
理想的方法是刷新并提交事务方法中的更改(无更改),但保持实体管理器打开且实体仍处于连接状态。然后实体将一直存在,直到请求完成。不幸的是,我看不到如何做到这一点。有状态会话 bean 支持扩展实体管理器;Quarkus 使用 CDI。
有没有办法让实体管理器对整个请求保持打开状态,并多次刷新和提交,而无需求助于低级手动代码?我更喜欢可移植的 JPA 解决方案,但如果我需要使用也可以接受的特定于 Hibernate 的代码。
解决方案
推荐阅读
- python - Python:从文件中读取最后“n”行
- java - 程序不聚焦时如何捕获热键输入?
- css - CSS 导航背景颜色仅在滚动到第一部分标签时更改
- c++ - 在 Visual Studio 中使用 XP 工具集编译时出现路径空间的 Windows XP 运行时问题
- android - 如何等待 ListAdapter.submitList() 执行并调用 RecyclerView.smoothScrollToPosition(0);
- r - 如何将参数传递给 plot.surface() [R fields package] 内部的 contour()
- php - 在 bluehost 上为 mysql 设置远程访问
- python - 模板从日期起休息一天
- jupyter-notebook - 如何从 Jupyter 中更改 Jupyter 内核和 conda 环境?
- php - 当存在某些查询字符串时定义 Laravel 路由