Activiti7笔记(二)Activiti7一共涉及到25张表,哪些操作会涉及哪些表,每张表的作用是什么
目录1 表结构介绍1.1 表的命名规则和作用1.2Activiti数据表介绍2 什么场景下要操作哪些表?2.1 流程部署涉及到的表2.1.1流程定义表 :[ACT_RE_DEPLOYMENT]2.1.2流程定义表 :[ACT_RE_PROCDEF]2.1.3一般数据 :[ACT_GE_BYTEARRAY]2.1.4一般数据 :[ACT_GE_PROPERTY]2.1.5 总结 : 操作数据表2.2
目录
1 表结构介绍
以下是Activiti7生成的25张表
1.1 表的命名规则和作用
看到刚才创建的表,我们发现Activiti 的表都以 ACT_ 开头。
第二部分是表示表的用途的两个字母标识。 用途也和服务的 API 对应。
ACT_RE :'RE’表示 repository。 这个前缀的表包含了流程定义和流程静态资源 (图片,规则,等等)。
ACT_RU:'RU’表示 runtime。 这些运行时的表,包含流程实例,任务,变量,异步任务,等运行中的数据。 Activiti 只在流程实例执行过程中保存这些数据, 在流程结束时就会删除这些记录。 这样运行时表可以一直很小速度很快。
ACT_HI:'HI’表示 history。 这些表包含历史数据,比如历史流程实例, 变量,任务等等。
ACT_GE : GE 表示 general。 通用数据, 用于不同场景下
1.2Activiti数据表介绍
表分类 | 表名 | 解释 |
---|---|---|
一般数据 | ||
[ACT_GE_BYTEARRAY] | 通用的流程定义和流程资源 | |
[ACT_GE_PROPERTY] | 系统相关属性 | |
流程历史记录 | ||
[ACT_HI_ACTINST] | 历史的流程实例 | |
[ACT_HI_ATTACHMENT] | 历史的流程附件 | |
[ACT_HI_COMMENT] | 历史的说明性信息 | |
[ACT_HI_DETAIL] | 历史的流程运行中的细节信息 | |
[ACT_HI_IDENTITYLINK] | 历史的流程运行过程中用户关系 | |
[ACT_HI_PROCINST] | 历史的流程实例 | |
[ACT_HI_TASKINST] | 历史的任务实例 | |
[ACT_HI_VARINST] | 历史的流程运行中的变量信息 | |
流程定义表 | ||
[ACT_RE_DEPLOYMENT] | 部署单元信息 | |
[ACT_RE_MODEL] | 模型信息 | |
[ACT_RE_PROCDEF] | 已部署的流程定义 | |
运行实例表 | ||
[ACT_RU_EVENT_SUBSCR] | 运行时事件 | |
[ACT_RU_EXECUTION] | 运行时流程执行实例 | |
[ACT_RU_IDENTITYLINK] | 运行时用户关系信息,存储任务节点与参与者的相关信息 | |
[ACT_RU_JOB] | 运行时作业 | |
[ACT_RU_TASK] | 运行时任务 | |
[ACT_RU_VARIABLE] | 运行时变量表 |
2 什么场景下要操作哪些表?
2.1 流程部署涉及到的表
流程部署,就是将bpmn文件,就是我们画好的流程图,保存到数据库里面;一共有25张表,那么会保存到哪几个表里面呢?
首先我们写代码,就是流程部署的代码,只要执行这个代码,我们的bpmn文件就可以保存到数据库了
/**
* 部署流程定义
*/
@Test
public void testDeployment(){
// 1、创建ProcessEngine
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
// 2、得到RepositoryService实例
RepositoryService repositoryService = processEngine.getRepositoryService();
// 3、使用RepositoryService进行部署
Deployment deployment = repositoryService.createDeployment()
.addClasspathResource("bpmn/evection.bpmn") // 添加bpmn资源
.addClasspathResource("bpmn/evection.png") // 添加png资源
.name("出差申请流程")
.deploy();
// 4、输出部署信息
System.out.println("流程部署id:" + deployment.getId());
System.out.println("流程部署名称:" + deployment.getName());
// 流程部署id:1
// 流程部署名称:出差申请流程
}
执行这个代码,会在控制台打印很多的东西,其中就有很多的sql语句,我们根据这些sql语句,就可以知道这段代码操作了哪些表;通过查看sql语句,分析得知,操作的表有:
2.1.1流程定义表 :[ACT_RE_DEPLOYMENT]
这个表就是部署单元信息表;
我们根据表名可以看到是属于RE表,RE表是资源信息相关的表;
执行完以上的代码,我们看数据库这个表里面存的是什么?
相当于只存了两个字段,一个是当前流程的名称,一个数执行代码时间,也就是部署时间;部署时间是自动生成的,当前流程名称是从哪来的?
原来我们在执行代码的时候,已经自己定义了
2.1.2流程部署表 :[ACT_RE_PROCDEF]
这个表里面存的是已部署的流程定义;
2.1.3一般数据 :[ACT_GE_BYTEARRAY]
GE表,里面存的是通用数据
这个表里面存的是通用的流程定义和流程资源
就是将我们的bpmn文件,png文件保存到数据库,这个表就是资源文件
2.1.4一般数据 :[ACT_GE_PROPERTY]
这个表里面存放的是 系统相关属性数据,只要操作这个数据库,就会修改这个表
这个表不是部署的时候唯一操作的表
2.1.5 总结 : 操作数据表
流程定义部署后操作activiti的3张表如下:
act_re_deployment 流程定义部署表,每部署一次增加一条记录
act_re_procdef 流程定义表,部署每个新的流程定义都会在这张表中增加一条记录
act_ge_bytearray 流程资源表
注意:
act_re_deployment和act_re_procdef一对多关系,一次部署在流程部署表生成一条记录,但一次部署可以部署多个流程定义,每个流程定义在流程定义表生成一条记录。每一个流程定义在act_ge_bytearray会存在两个资源记录,bpmn和png。
建议一次部署一个流程,这样部署表和流程定义表是一对一有关系,方便读取流程部署及流程定义信息。
2.2 启动流程实例涉及到的表
启动流程实例,就相当于张三创建出差申请;
相关的代码
/**
* 启动流程实例,相当于申请提交申请单
*/
@Test
public void testStartProcess(){
// 1、创建ProcessEngine
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
// 2、获取RunTimeService
RuntimeService runtimeService = processEngine.getRuntimeService();
// 3、根据流程定义Id启动流程
ProcessInstance processInstance = runtimeService
.startProcessInstanceByKey("myJtxx");
// 输出内容
System.out.println("流程定义id:" + processInstance.getProcessDefinitionId());
System.out.println("流程实例id:" + processInstance.getId());
System.out.println("当前活动Id:" + processInstance.getActivityId());
//
// 流程定义id:myJtxx:1:4
// 流程实例id:2501
// 当前活动Id:null
}
以上代码执行完,输出的结果是
// 流程定义id:myJtxx:1:4
// 流程实例id:2501
// 当前活动Id:null
那么以上代码操作的数据库的表有哪几个?
2.2.1 一般数据 [ACT_GE_PROPERTY]
这个是系统相关属性相关的 表,只要操作数据库,这个表里面的数据就会变化,就是对这个表进行更新操作
2.2.2 流程历史记录 [ACT_HI_ACTINST]
这个表里面存的是历史的流程实例;
张三刚创建一个申请单,这个表里面就只有两个数据;
创建出差申请的时候,开始标志出差申请已经完成,所以这个里面第一个数据有开始时间,有结束时间;
只是创建出差申请,所以第二个数据是没有结束时间的
以上这3个的字段值,是我们在bpmn里面定义的
2.2.3 流程历史记录[ACT_HI_IDENTITYLINK]
历史的流程运行过程中用户关系
就是在走流程的时候,涉及到的人,都会保存在这个表里面;
2.2.4 流程历史记录[ACT_HI_PROCINST]
历史的流程实例
2.2.5 流程历史记录[ACT_HI_TASKINST]
历史的任务实例
一个节点可以认为是一个任务,每一个节点的创建都会在这个里面进行保存一条数据
2.2.6 运行实例表[ACT_RU_EXECUTION]
运行时流程执行实例;
这个表里面主要记录的是当前已经执行到哪个节点了,把对应的节点对象记录到这个里面
2.2.7 运行实例表[ACT_RU_IDENTITYLINK]
运行时用户关系信息,存储任务节点与参与者的相关信息
也就是只要当前任务有参与者,就会将参与者的信息保存到这个表,多个人参与,保存多个信息
2.2.8 运行实例表[ACT_RU_TASK]
运行时任务
一个流程有多个节点,到某一个节点的时候,都会更新这个表,将当前节点的数据更新到这个表
2.2.9 总结: 操作数据表
act_hi_actinst 流程实例执行历史
act_hi_identitylink 流程的参与用户历史信息
act_hi_procinst 流程实例历史信息
act_hi_taskinst 流程任务历史信息
act_ru_execution 流程执行信息
act_ru_identitylink 流程的参与用户信息
act_ru_task 任务信息
2.3 个人任务查询–所涉及到的表
也就是,某一个人登录系统,可以查看属于自己的节点,就是是否流程走到自己这里了;如果走到这里,就查询出来;
流程启动后,任务的负责人就可以查询自己当前需要处理的任务,查询出来的任务都是该用户的待办任务。
那么当一个人获取数据,是要查询数据库里面的哪个表呢?
我们执行完查询的代码,看到控制台打印了查询日志
select distinct RES.*
FROM ACT_RU_TASK RES
INNER JOIN ACT_RE_PROCDEF D
ON RES.PROC_DEF_ID_ = D.ID_
WHERE RES.ASSIGNEE_ = 'zs' and D.KEY_ = 'myJtxx' order by RES.ID_ asc
LIMIT 2147483647 OFFSET 0;
我们分析这个sql语句, 查询了两个表,ACT_RU_TASK 和ACT_RE_PROCDEF表;
ACT_RU_TASK 运行时任务表,就是对于一个流程,已经走到哪个节点了,这个里面保存的就是当前正在走的节点的信息;
ACT_RE_PROCDEF 已部署的流程定义表 ,就是部署流程的时候,创建的流程信息;
两个表联查,就可以查询到某一个用户,在某一个流程中,自己所需要处理的任务的list集合;
2.4 完成个人任务–所涉及到的表
// 完成任务,
@Test
public void completTask(){
// 获取引擎
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
// 获取taskService
TaskService taskService = processEngine.getTaskService();
// 根据流程key 和 任务的负责人 查询任务
// 返回一个任务对象
Task task = taskService.createTaskQuery()
.processDefinitionKey("myJtxx") //流程Key
.taskAssignee("jing") //要查询的负责人
.singleResult();
// 完成任务,参数:任务id
taskService.complete(task.getId());
}
张三要提交申请单,就是要完成自己的任务,让其他人进行审核,张三完成任务的代码就是以上的代码;
ACT_RU_TASK 运行时任务表,就是对于一个流程,已经走到哪个节点了,这个里面保存的就是当前正在走的节点的信息;也就是保存的是当前正在执行的任务;
act_hi_taskinst 流程任务历史信息 已经执行完成的任务,都会保存在这个里面
**[ACT_HI_ACTINST]**历史的流程实例
**[ACT_HI_IDENTITYLINK]**历史的流程运行过程中用户关系
**[ACT_RU_EXECUTION]**运行时流程执行实例
**[ACT_RU_IDENTITYLINK]**运行时用户关系信息,存储任务节点与参与者的相关信息 这个是更新操作
2.4 完成整个流程任务,哪些表还有数据
一个流程实例走完了之后,关于运行的表,里面的数据都没有了
以下这些表都没有了
2.5 查询流程定义–所涉及到的表
act_re_deployment
我们进行部署流程的 时候,会在ACT_RE_PROCDEF这个表里面存流程数据,所以现在只是查询这个表就可以将对应的流程查询出来
/**
* 查询流程定义
*/
@Test
public void queryProcessDefinition(){
// 获取引擎
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
// repositoryService
RepositoryService repositoryService = processEngine.getRepositoryService();
// 得到ProcessDefinitionQuery 对象
ProcessDefinitionQuery processDefinitionQuery = repositoryService.createProcessDefinitionQuery();
// 查询出当前所有的流程定义
// 条件:processDefinitionKey =evection
// orderByProcessDefinitionVersion 按照版本排序
// desc倒叙
// list 返回集合
List<ProcessDefinition> definitionList = processDefinitionQuery.processDefinitionKey("myJtxx")
.orderByProcessDefinitionVersion()
.desc()
.list();
// 输出流程定义信息
for (ProcessDefinition processDefinition : definitionList) {
System.out.println("流程定义 id="+processDefinition.getId());
System.out.println("流程定义 name="+processDefinition.getName());
System.out.println("流程定义 key="+processDefinition.getKey());
System.out.println("流程定义 Version="+processDefinition.getVersion());
System.out.println("流程部署ID ="+processDefinition.getDeploymentId());
}
}
2.6 流程删除–所涉及到的表
删除的代码是
public void deleteDeployment() {
// 流程部署id
String deploymentId = "1";
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
// 通过流程引擎获取repositoryService
RepositoryService repositoryService = processEngine
.getRepositoryService();
//删除流程定义,如果该流程定义已有流程实例启动则删除时出错
repositoryService.deleteDeployment(deploymentId);
//设置true 级联删除流程定义,即使该流程有流程实例启动也可以删除,设置为false非级别删除方式,如果流程
//repositoryService.deleteDeployment(deploymentId, true);
}
执行完以上的代码,删除了哪些表?
和创建流程的表是一样的,就是这3个表;
[ACT_RE_DEPLOYMENT]
[ACT_RE_PROCDEF]
[ACT_GE_BYTEARRAY]
历史记录里面的表是不会删除的
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)