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]

历史记录里面的表是不会删除的

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐