下面仍然以一个简单的请假流程为例说明JPA的具体使用方法。
该请假实例只有一个用户任务,先由用户填写表单数据,发起一个请假流程,然后交由部门经理审批,如图6.1所示。
图6.1 请假流程图
流程定义leave-process.bpmn20.xml如下:
请假表单leave.form设计如下:
定义一个请假申请表单类,具体代码如下:
注意,Flowable引擎表单类型Date映射的是org.joda.time.LocalDate类,并不是JDK8自带的Java.time.LocalDate类。
在流程中配置一个start类型的监听器,作用是读取用户填写的表单内容并创建实体类对象持久化到数据库中,修改XML内容如下:
增加一个实体类管理器,将表单数据映射成实体类并存入数据库:
下面展示填写表单,启动流程的具体代码,Service层代码如下:
Controller层代码如下:
启动应用后,使用cURL测试,代码如下:
这样在流程启动后,查询数据表event_leave会看到一条数据,如图6.2所示。
图6.2 查询数据表
我们再来观察运行时变量表ACT_RU_VARIABLE,如图6.3所示。
图6.3 运行时变量表
可以看到变量leave的类型字段(TYPE_)为“jpa-entity”,该记录的TEXT_、TEXT2_字段分别代表实体的完整类名和主键ID。
在流程运行时,如果用户填写了任务表单,那么需要把改动的数据更新到实体中,比如在部门领导审核节点完成后保存审批意见。同样地,在用户任务上添加一个complete类型的监听器,修改XML内容如下:
Service层增加方法如下:
Controller层增加方法如下:
使用cURL测试如下:
查询请假表的数据,如图6.4所示。
同样变量表中的值也被修改。上面我们只设置了变量值,没有修改数据库,为什么就达到了修改实体属性的目的呢?这是因为Spring Boot已经帮我们配置了事务管理器,即由Spring Boot接管了Flowable的事务,当更改实体属性并提交事务时就自动执行了数据库的更新操作。
图6.4 查询数据表2
虽然我们已经成功把表单数据单独保存在用户自定义表中,但是还有一个问题没有解决,那就是把历史变量表的对应数据删除,从而给历史变量表瘦身,提高查询效率。
同样地,我们设置一个end类型的监听器清理历史变量表数据,修改XML内容如下:
leaveEndListener是一个Service类,作用是把历史变量表ACT_HI_VARINST中对应的数据删除,具体代码如下: