首页 > 解决方案 > 具有扩展实体管理器或同步点(多次提交)的 Quarkus 应用程序

问题描述

我正在编写一个 Quarkus 应用程序来处理需要分阶段提交的非常复杂的请求。基本上(在同一请求范围内)需要完成一些初始工作并记录请求 - 然后是更多必须记录的工作,以及更多必须记录的工作。最后请求结束并提交最后的工作。

当前解决方案使用 @Transactional 方法进行更新。这样可行。对于每个方法调用,更改都会保存并提交到数据库。问题是它效率低下。

从功能上讲,JPA 实体实际上是从请求开始到请求结束。在整个请求期间对相同的对象进行轻微修改,并且使用现有代码,每次更改都需要一个merge,它在应用更新之前刷新数据库中的实体(或真正的实体图)。或者,更改可以使用带有更新的 JPA 查询,但这很麻烦并且需要大量脆弱的代码。

我已经尝试过使用特定于 Hibernate 的update方法作为 的替代方法merge,但是虽然它可能适用于简单的实体,但它会对集合(@ElementCollection、@OneToMany)造成严重破坏。手动 JPA 更新查询效果更好。

理想的方法是刷新并提交事务方法中的更改(无更改),但保持实体管理器打开且实体仍处于连接状态。然后实体将一直存在,直到请求完成。不幸的是,我看不到如何做到这一点。有状态会话 bean 支持扩展实体管理器;Quarkus 使用 CDI。

有没有办法让实体管理器对整个请求保持打开状态,并多次刷新和提交,而无需求助于低级手动代码?我更喜欢可移植的 JPA 解决方案,但如果我需要使用也可以接受的特定于 Hibernate 的代码。

标签: javahibernatejpatransactionsquarkus

解决方案


推荐阅读