15. 流量管理持久化

大多数应用程序以某种方式访问数据。 许多内容会修改多个用户共享的数据,因此需要事务性数据访问属性。 它们通常将关系数据集转换为域对象以支持应用处理。 Web Flow 提供“流管理持久化”功能,流可以为你创建、提交并关闭对象持久化上下文。 Web Flow 集成了 Hibernate 和 JPA 的对象持久化技术。spring-doc.cadn.net.cn

除了流量管理的持久性外,还有完全封装的模式持久性上下文在你的应用服务层内进行管理。 在这种情况下,网页层就不会涉及持久化。 相反,它完全处理被传递给服务层并返回的分离对象。 本章重点介绍流管理持久化,探讨如何以及何时使用该功能。spring-doc.cadn.net.cn

15.1. 流量示波器持久性上下文

这种模式产生了持久性上下文flowScope(流控镜)在流启动时,在流执行过程中利用该上下文访问数据,并在最后提交对持久实体的更改。 该模式通过仅在流程执行结束时提交数据库的更改,实现中间编辑的隔离。 这种模式常与乐观锁定策略结合使用,以保护多个用户并行修改的数据完整性。 为了支持在较长时间内保存和重启流的进度,必须使用流态的持久存储。 如果不需要保存和重启功能,标准的基于会话的流态存储即可。 在这种情况下,会话在提交前到期或结束,可能会导致更改丢失。spring-doc.cadn.net.cn

使用流域持久性上下文模式,首先标记你的流程为持久性上下文如下:spring-doc.cadn.net.cn

<?xml version="1.0" encoding="UTF-8"?>
<flow xmlns="http://www.springframework.org/schema/webflow"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="http://www.springframework.org/schema/webflow
                          https://www.springframework.org/schema/webflow/spring-webflow.xsd">

    <persistence-context />

</flow>

然后配置正确的FlowExecutionListener将这个模式应用到你的心流中。 如果你使用Hibernate,请注册HibernateFlowExecutionListener. 如果你用JPA,注册JpaFlowExecutionListener. 以下示例使用JPA:spring-doc.cadn.net.cn

<webflow:flow-executor id="flowExecutor" flow-registry="flowRegistry">
    <webflow:flow-execution-listeners>
        <webflow:listener ref="jpaFlowExecutionListener" />
    </webflow:flow-execution-listeners>
</webflow:flow-executor>

<bean id="jpaFlowExecutionListener"
      class="org.springframework.webflow.persistence.JpaFlowExecutionListener">
    <constructor-arg ref="entityManagerFactory" />
    <constructor-arg ref="transactionManager" />
</bean>

要在结尾触发提交,请在终态具有提交属性的元素,具体如下:spring-doc.cadn.net.cn

<end-state id="bookingConfirmed" commit="true" />

就是这样。 当你的流程开始时,监听者负责分配一个新的实体管理器flowScope(流控镜). 你可以参考这个实体管理器随时从你的心流中使用特殊功能持久性上下文变量。 此外,使用Spring管理的数据访问对象时,任何数据访问都会自动使用该数据实体管理器. 此类数据访问作应始终以非事务方式或只读事务运行,以保持中间编辑的隔离。spring-doc.cadn.net.cn

15.2. 流量管理持久化与子流

一个管理的流程持久性上下文自动扩展(传播)到子流,假设每个子流也具有<坚持-语境/>变量。 当子流重用持久性上下文由父节点启动,当达到结束状态时,它会忽略提交标志,从而将最终决定(是否提交)推迟给父节点。spring-doc.cadn.net.cn