Hibernate JPA:applicationManaged EntityManager for Java SE以编程方式控制事务生命周期

Hibernate JPA:applicationManaged EntityManager for Java SE以编程方式控制事务生命周期,hibernate,jpa,jpa-2.0,Hibernate,Jpa,Jpa 2.0,我很难找到一个好的解决方案来支持UI可以启动和提交事务的特性 在我以前处理事务性应用程序的方法中,我将工作单元分组到后端的服务方法中,并用spring的@transactional注释它 但是想象一下,我有几个这样的服务方法,由前端将服务方法调用分组到事务中 例如,我有methodServiceA、methodServiceB、methodServiceC。 UI可以通过以下任意组合执行类似操作: 组合1: 启动事务 调用methodServiceA+调用methodServiceB 提交事务

我很难找到一个好的解决方案来支持UI可以启动和提交事务的特性

在我以前处理事务性应用程序的方法中,我将工作单元分组到后端的服务方法中,并用spring的@transactional注释它


但是想象一下,我有几个这样的服务方法,由前端将服务方法调用分组到事务中

例如,我有methodServiceA、methodServiceB、methodServiceC。 UI可以通过以下任意组合执行类似操作:

组合1:

  • 启动事务
  • 调用methodServiceA+调用methodServiceB
  • 提交事务
  • 组合2:

  • 启动事务
  • 调用methodServiceB+调用methodServiceC
  • 提交事务
  • 组合3:

  • 启动事务
  • 调用方法服务A+调用方法服务B+调用方法服务C
  • 提交事务
  • 基本上,后端只提供服务方法,由UI或其他应用程序使用后端启动/提交事务


    所以这就是我要处理的基本情况。。这是我的想法。请分享一些其他选项,或者我可以做的改进来支持此功能。我目前正在考虑使用应用程序管理的entitymanager,因为我认为在这种情况下使用@Transactional不起作用

    我想到了一个UI或其他连接器可以用来:

  • 创建实体管理器并将其与唯一id关联
  • 从em启动事务
  • 从em设置超时
  • 从em提交事务
  • 如果em中存在任何异常,则自动回滚事务
  • 将事务的实体管理器提供给服务方法,以便它们使用相同的实体管理器
  • 在从em提交或回滚后,最终关闭实体管理器
  • 因此,对于组合1的示例,流程如下所示:

  • ui使用该工具启动事务,并获取entitymanager id
  • 在调用methodServiceA+调用methodServiceB时传递entitymanager id,以便这些方法可以使用与id关联的正确实体管理器
  • 提交事务

  • 请分享你对这件事的看法,谢谢


    关于外观/命令模式:

    谢谢你的主意。但是我也考虑过这一点,我认为它不适合我们的需要,因为我不能总是在后端为出现的每一个需要(想象一下每个ui按钮可以组合他们想要的任何方法服务)提供facade服务

    其基本思想是拥有其他前端应用程序可以连接在一起的公共服务方法


    而且,使用facade模式意味着facade方法中没有ui逻辑。在我们的例子中,ui逻辑可以与前端中的事务处理和调用服务方法一起完成。

    使用facade模式:创建一个facade服务,其中包含每个组合的方法(应该映射到功能用例),并使用Spring注释使这些facade方法具有事务性。facade方法将只调用现有的服务方法。

    您可以尝试使用-UI发送一系列命令,您的后端在单个事务中执行这些命令


    或者,看看-的概念,它类似于您提出的方法,尽管在这种情况下,步骤并不共享相同的事务。也许一些关于它的想法与您的情况相关。

    谢谢,我已经更新了上面底部的答案。是的,我已经浏览了扩展持久性上下文,但是它只在有状态bean中可用,我没有使用有状态bean。因此,目前,我致力于应用程序管理实体管理器,同时仍然希望有一些东西可以缓解我的生活,哈哈