当前位置: 首页 > news >正文

Activiti源码跟踪之模型Model操作

Activiti源码跟踪之模型Model操作

模型model设计到的表ACT_RE_MODEL、ACT_GE_BYTEARRAY

ACT_RE_MODEL表结构:

CREATE TABLE `ACT_RE_MODEL` (`ID_` varchar(64) COLLATE utf8_bin NOT NULL,`REV_` int(11) DEFAULT NULL,`NAME_` varchar(255) COLLATE utf8_bin DEFAULT NULL,`KEY_` varchar(255) COLLATE utf8_bin DEFAULT NULL,`CATEGORY_` varchar(255) COLLATE utf8_bin DEFAULT NULL,`CREATE_TIME_` timestamp NULL DEFAULT NULL,`LAST_UPDATE_TIME_` timestamp NULL DEFAULT NULL,`VERSION_` int(11) DEFAULT NULL,`META_INFO_` varchar(4000) COLLATE utf8_bin DEFAULT NULL,`DEPLOYMENT_ID_` varchar(64) COLLATE utf8_bin DEFAULT NULL,`EDITOR_SOURCE_VALUE_ID_` varchar(64) COLLATE utf8_bin DEFAULT NULL,`EDITOR_SOURCE_EXTRA_VALUE_ID_` varchar(64) COLLATE utf8_bin DEFAULT NULL,`TENANT_ID_` varchar(255) COLLATE utf8_bin DEFAULT '',PRIMARY KEY (`ID_`),KEY `ACT_FK_MODEL_SOURCE` (`EDITOR_SOURCE_VALUE_ID_`),KEY `ACT_FK_MODEL_SOURCE_EXTRA` (`EDITOR_SOURCE_EXTRA_VALUE_ID_`),KEY `ACT_FK_MODEL_DEPLOYMENT` (`DEPLOYMENT_ID_`),CONSTRAINT `ACT_FK_MODEL_DEPLOYMENT` FOREIGN KEY (`DEPLOYMENT_ID_`) REFERENCES `ACT_RE_DEPLOYMENT` (`ID_`),CONSTRAINT `ACT_FK_MODEL_SOURCE` FOREIGN KEY (`EDITOR_SOURCE_VALUE_ID_`) REFERENCES `ACT_GE_BYTEARRAY` (`ID_`),CONSTRAINT `ACT_FK_MODEL_SOURCE_EXTRA` FOREIGN KEY (`EDITOR_SOURCE_EXTRA_VALUE_ID_`) REFERENCES `ACT_GE_BYTEARRAY` (`ID_`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;

其中ACT_RE_MODEL有三个外键,对应ACT_GE_BYTEARRAY的有两个。

CREATE TABLE `ACT_GE_BYTEARRAY`  (`ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,`REV_` int NULL DEFAULT NULL,`NAME_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,`DEPLOYMENT_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,`BYTES_` longblob NULL,`GENERATED_` tinyint NULL DEFAULT NULL,PRIMARY KEY (`ID_`) USING BTREE,INDEX `ACT_FK_BYTEARR_DEPL`(`DEPLOYMENT_ID_`) USING BTREE,CONSTRAINT `ACT_FK_BYTEARR_DEPL` FOREIGN KEY (`DEPLOYMENT_ID_`) REFERENCES `ACT_RE_DEPLOYMENT` (`ID_`) ON DELETE RESTRICT ON UPDATE RESTRICT
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_bin ROW_FORMAT = Dynamic;

EDITOR_SOURCE_VALUE_ID_对应ACT_GE_BYTEARRAY的ID_,表示该模型对应的模型文件(json格式数据)。repositoryService.addModelEditorSource方法实现。

EDITOR_SOURCE_EXTRA_VALUE_ID_对应ACT_GE_BYTEARRAY的ID_,表示该模型生成的图片文件。repositoryService.addModelEditorSourceExtra方法实现。

1、保存模型:

Model modelData = repositoryService.newModel();
repositoryService.saveModel(modelData);

执行对应的SaveModelCmd。会插入或更新ACT_RE_MODEL的数据。

SaveModelCmd对应的execute方法:

public Void execute(CommandContext commandContext) {if(model == null) {throw new ActivitiIllegalArgumentException("model is null");}if (model.getId() == null) {commandContext.getModelEntityManager().insertModel(model);} else {commandContext.getModelEntityManager().updateModel(model);}return null;}

执行对应的insert或update方法:
insert方法分发ENTITY_CREATED和ENTITY_INITIALIZED事件:

  public void insertModel(Model model) {((ModelEntity) model).setCreateTime(Context.getProcessEngineConfiguration().getClock().getCurrentTime());((ModelEntity) model).setLastUpdateTime(Context.getProcessEngineConfiguration().getClock().getCurrentTime());getDbSqlSession().insert((PersistentObject) model);if(Context.getProcessEngineConfiguration().getEventDispatcher().isEnabled()) {Context.getProcessEngineConfiguration().getEventDispatcher().dispatchEvent(ActivitiEventBuilder.createEntityEvent(ActivitiEventType.ENTITY_CREATED, model));Context.getProcessEngineConfiguration().getEventDispatcher().dispatchEvent(ActivitiEventBuilder.createEntityEvent(ActivitiEventType.ENTITY_INITIALIZED, model));}}

update方法分发ENTITY_UPDATED方法:

public void updateModel(ModelEntity updatedModel) {CommandContext commandContext = Context.getCommandContext();updatedModel.setLastUpdateTime(Context.getProcessEngineConfiguration().getClock().getCurrentTime());DbSqlSession dbSqlSession = commandContext.getDbSqlSession();dbSqlSession.update(updatedModel);if(Context.getProcessEngineConfiguration().getEventDispatcher().isEnabled()) {Context.getProcessEngineConfiguration().getEventDispatcher().dispatchEvent(ActivitiEventBuilder.createEntityEvent(ActivitiEventType.ENTITY_UPDATED, updatedModel));}}

2、保存其他信息(模型文件或图片)

保存模型文件(json格式)。涉及到的表:ACT_RE_MODEL、ACT_GE_BYTEARRAY

repositoryService.addModelEditorSource(modelData.getId(), editorNode.toString().getBytes("utf-8"));

AddEditorSourceForModelCmd:

public Object execute(CommandContext commandContext) {commandContext.getModelEntityManager().insertEditorSourceForModel(modelId, bytes);return null;}
}

insertEditorSourceForModel

public void insertEditorSourceForModel(String modelId, byte[] modelSource) {ModelEntity model = findModelById(modelId);if (model != null) {ByteArrayRef ref = new ByteArrayRef(model.getEditorSourceValueId());ref.setValue("source", modelSource);if (model.getEditorSourceValueId() == null) {model.setEditorSourceValueId(ref.getId());updateModel(model);}}}

其中ref.setValue(“source”, modelSource)方法对

model.getEditorSourceValueId() == null 生成DbSqlSession的inser语句,最后执行updateModel方法
model.getEditorSourceValueId() != null ,ByteArrayRef.ensureInitialized()方法调用DbSqlSession.selectById(),ByteArrayEntity存放在canche。ByteArrayRef.setBytes(bytes); 把新的byte值设进 ByteArrayEntity
DbSqlSession.flush()的getUpdatedObjects()方法,比较persistentObject对象,生成update

相关文章:

Activiti源码跟踪之模型Model操作

Activiti源码跟踪之模型Model操作 模型model设计到的表ACT_RE_MODEL、ACT_GE_BYTEARRAY ACT_RE_MODEL表结构: CREATE TABLE ACT_RE_MODEL (ID_ varchar(64) COLLATE utf8_bin NOT NULL,REV_ int(11) DEFAULT NULL,NAME_ varchar(255) COLLATE utf8_bin DEFAULT N…...

C#-WinForm-发送邮件

登录QQ邮箱——设置——开启“POP3/SMTP服务” 登陆QQ邮箱→打开设置→开启“POP3/SMTP服务”,获取“授权码” 简单总结一下: 1、使用SmtpClient发送电子邮件是很简单的,只要正确创建了MailMessage对象和SmtpClient就可以很容易的发送出去电…...

Springboot整合jdbc和Mybatis

目录 整合jdbc 1. 新建项目 2. 编写yaml配置文件连接数据库 3. 测试类 使用原生的jdbcTemplate进行访问测试 使用Druid连接池 1. 添加类型 2. 初始化连接池 3. 编写config类 配置Druid数据源监视 整合Mybatis 1. 导入依赖 2. 编写mapper接口 3. 编写实体类 4. 编…...

日常生活中的常用命令及操作

目录 一、Windows11 中查看网卡名称 及ip地址 二、查看硬件的详细信息 三、查看显卡声卡详细信息及厂商 四、C盘清理 第一步 输入wini 开启Windows设置主界面 第二步 存储中还有一个叫存储感知的功能 第三步 更改新内容的保存位置 第四步 怕误C盘内的东西可以 查看详细的…...

【C++杂货铺】国庆中秋特辑——多态由浅入深详细总结

文章目录 一、多态的概念二、多态的定义及实现2.1 多态的构成条件2.2 虚函数2.3 虚函数的重写2.4 虚函数重写的两个例外2.4.1 协变(基类与派生类虚函数返回值类型不同)2.4.2 析构函数的重写(基类与派生类析构函数的名字不同) 2.5 …...

MongoDB基础详解

一、MongoDB概述 MongoDB 是一个基于 分布式文件存储 的开源 NoSQL 数据库系统,由 C 编写的。MongoDB 提供了 面向文档 的存储方式,操作起来比较简单和容易,支持“无模式”的数据建模,可以存储比较复杂的数据类型,是一…...

解锁前端Vue3宝藏级资料 第五章 Vue 组件应用 4 ( provide 和 inject )

5.5 provide 和 inject 前面的知识告诉我们vue中组件之间传递值需要使用props来完成,但是props也有一定局限性。这个时候在vue3中还有另外的解决方法。那就是使用 provide 和 inject 允许父组件将数据传递给所有后代组件,而不管组件层次结构有多深。你要…...

【List篇】LinkedList 详解

目录 成员变量属性构造方法add(), 插入节点方法remove(), 删除元素方法set(), 修改节点元素方法get(), 取元素方法ArrayList 与 LinkedList的区别Java中的LinkedList是一种实现了List接口的 双向链表数据结构。链表是由一系列 节点(Node)组成的,每个节点包含了指向 上一个…...

推动统一供应链“度量衡”,上汽大通突破传统拥抱SaaS生态

中国汽车市场规模已连续14年位居世界第一,目前占世界汽车份额31%。近年来,物联网、人工智能、电池等技术的快速发展,也为中国从汽车大国逐步迈向汽车强国注入巨大动力。在新一轮的汽车产业变革中,构建一个更智能、更高效协同的供应…...

蓝牙核心规范(V5.4)10.9-BLE 入门笔记之GAP

1.概述 蓝牙核心规范的通用访问配置文件(GAP)部分定义了与设备发现和在两个设备之间建立连接有关的过程。如何执行数据的基本无连接通信、如何使用周期性广播(参见 PADVB-LE Periodic Advertising Broadcast)以及如何设置等时通信(参见 LE BIS和LE CIS - Isochronous Com…...

nginx 配置 ssl

1.1 Nginx如果未开启SSL模块,配置Https时提示错误 原因也很简单,nginx缺少http_ssl_module模块,编译安装的时候带上--with-http_ssl_module配置就行了,但是现在的情况是我的nginx已经安装过了,怎么添加模块&#xff0…...

家居设计软件Live Home 3D Pro mac中文版特点介绍

Live Home 3D Pro mac是一款专业的3D家居设计软件,可以帮助用户轻松创建和设计家居平面图和3D模型,并进行渲染和虚拟漫游。​​​​​​​ ​Live Home 3D Pro mac软件特点 1. 界面友好:Live Home 3D Pro的界面友好,操作简单方便…...

OkHttp - 现代应用网络的方式

官网:Overview - OkHttp HTTP is the way modern applications network. It’s how we exchange data & media. Doing HTTP efficiently makes your stuff load faster and saves bandwidth. OkHttp is an HTTP client that’s efficient by default: HTTP/2 s…...

SpringBoot3基础:最简项目示例

说明 本文建立一个最基本的SpringBoot3项目&#xff0c;依赖项仅包含 spring-web&#xff08;SpringMVC&#xff09;。 备注&#xff1a;SpringBoot3需要JDK17支持&#xff0c;配置方法参考&#xff1a; SpringBoot3项目中配置JDK17 项目结构图示 POM <?xml version&qu…...

flex:1详解,以及flex:1和flex:auto的区别

什么是flex&#xff1a;1&#xff1f; 在css中&#xff0c;我们经常可以看到这样的写法&#xff1a; .box {display: flex; }.item {flex: 1; }这里的flex:1相当于flex: 1 1 0%&#xff0c;它是一个简写属性&#xff0c;表示项目&#xff08;flex item&#xff09;在弹性容器…...

在VMware虚拟机中固定CentOS系统ip(使用桥接模式)

目录 一、前置说明二、前置准备2.1、切换虚拟机网络为桥接模式2.2、查看本机网络信息 三、配置CentOS系统IP3.1、进入系统输入ip addr 查看本机网络配置名称3.2、查看网络配置目录&#xff0c;网络配置文件名称3.3、修改网络配置文件 ifcfg-ens33 固定IP3.4、重启网络 一、前置…...

怎样才能让百度搜索到自己的博客?--九五小庞

怎么把自己的博客推荐到百度、Google等主要搜索引擎&#xff1f; 如果不把你的博客提交到各大搜索引擎中&#xff0c;它们一般是不会收录你的博客的&#xff0c;你可以先尝试一下看看能不能在百度搜到你的博客吧。 如果搜不到的话说明你的博客还没有被百度收录&#xff0c;那么…...

【学习笔记】多模态综述

多模态综述 前言1. CLIP & ViLT2. ALBEF3. VLMO4. BLIP5. CoCa6. BeiTv3总结参考链接 前言 本篇学习笔记虽然是多模态综述&#xff0c;本质上是对ViLT后多模态模型的总结&#xff0c;时间线为2021年至2022年&#xff0c;在这两年&#xff0c;多模态领域的模型也是卷的飞起…...

MLAgents (0) Unity 安装及运行

1、下载ML-Agents 下载地址 GitHub - Unity-Technologies/ml-agents: The Unity Machine Learning Agents Toolkit (ML-Agents) is an open-source project that enables games and simulations to serve as environments for training intelligent agents using deep reinfo…...

typename关键字详解(消除歧义)

typename关键字详解 文章目录 typename关键字详解定义用法1.和class同义&#xff0c;用于引入泛型编程中所用到的模板参数2.用来消除歧义&#xff0c;告诉编译器后面的是类型名而不是变量名 定义 typename相当于泛型编程中class的同义关键字&#xff0c;用来指出模板类型所依赖…...

设计模式_解释器模式

解释器模式 案例 角色 1 解释器基类 &#xff08;BaseInterpreter&#xff09; 2 具体解释器1 2 3... (Interperter 1 2 3 ) 3 内容 (Context) 4 用户 (user) 流程 (上下文) ---- 传…...

【算法基础】数学知识

质数 质数的判定 866. 试除法判定质数 - AcWing题库 时间复杂度是logN #include<bits/stdc.h> using namespace std; int n; bool isprime(int x) {if(x<2) return false;for(int i2;i<x/i;i){if(x%i0) return false;}return true; } signed main() {cin>&g…...

PDCA循环

目录 1.认识PDCA&#xff1a; 2.PDCA循环的经典案例 3.PDCA的四个阶段和八个步骤 4.PDCA循环的优缺点&#xff1a; 5.案例 6.其他作用 1.认识PDCA&#xff1a; PDCA循环最早由美国质量统计控制之父Shewhat&#xff08;休哈特&#xff09;提出的PDS&#xff08;Plan Do Se…...

Redis 缓存雪崩、缓存穿透、缓存击穿

Redis 是一种常用的内存缓存工具&#xff0c;但在某些情况下&#xff0c;它可能会遭受缓存雪崩、缓存穿透和缓存击穿等问题。下面是一些预防这些问题的建议&#xff1a; 1、缓存雪崩 缓存雪崩指的是在某个时间点上&#xff0c;大量的缓存数据同时失效或过期&#xff0c;导致大…...

Android Media3 ExoPlayer 开启缓存功能

ExoPlayer 开启播放缓存功能&#xff0c;在下次加载已经播放过的网络资源的时候&#xff0c;可以直接从本地缓存加载&#xff0c;实现为用户节省流量和提升加载效率的作用。 方法一&#xff1a;采用 ExoPlayer 缓存策略 第 1 步&#xff1a;实现 Exoplayer 参考 Exoplayer 官…...

MyBatis注解开发

MyBatis常用注解 注解对应XML说明Insert< insert>新增SQLUpdate< update>更新SQLDelete< delete>删除SQLSelect< select>查询SQLParam–参数映射Results< resultMap>结果映射Result< id>< result>字段映射 开发流程&#xff1a; 1…...

C# Onnx Yolov8 Cls 分类

效果 项目 代码 using Microsoft.ML.OnnxRuntime; using Microsoft.ML.OnnxRuntime.Tensors; using OpenCvSharp; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System…...

Fiddler常用的快键键

Fiddler有很多常用的快捷键&#xff0c;这些快捷键可以帮助你更快速地完成任务。以下是一些常用的快捷键&#xff1a; F12&#xff1a;启动/停止抓包。 CtrlR&#xff1a;打开FiddlerScript窗口。 CtrlH&#xff1a;切换到 Inspector 页签的 Header 视图。 CtrlT&#xff1a;切…...

【Linux】生产消费模型 + 线程池

文章目录 &#x1f4d6; 前言1. 生产消费模型2. 阻塞队列2.1 成员变量&#xff1a;2.2 入队(push)和出队(pop)&#xff1a;2.3 封装与测试运行&#xff1a;2.3 - 1 对代码进一步封装2.3 - 2 分配运算任务2.3 - 3 测试与运行 3. 循环阻塞队列3.1 POSIX信号量&#xff1a;3.1 - 1…...

基于springboot+vue的爱心助农网站(前后端分离)

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容&#xff1a;毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 项目介绍…...

传媒公司做网站编辑 如何/自媒体发稿

上篇只是简单的介绍了插件的组成 这次准备进行更深一步的研究 官网下载plugin模板 sublime 打开3个js文件 首先common.js是不需要研究的 打开edittime.js 我们先来看这几个&#xff1a; 我们将其中的值更改为&#xff1a; 安装插件看看效果 以这种形式压缩&…...

zhihe网站建设 淘宝/近期国际新闻

1. 模板的概念。 我们已经学过重载(Overloading)&#xff0c;对重载函数而言,C的检查机制能通过函数参数的不同及所属类的不同。正确的调用重载函数。例如&#xff0c;为求两个数的最大值&#xff0c;我们定义MAX()函数需要对不同的数据类型分别定义不同重载(Overload)版本。 /…...

凡客建站免费的可以用多久/怎么seo关键词优化排名

在使用Sublime编辑器时&#xff0c;有自动补齐功能&#xff0c;补齐后要跳出常用的做法是去移动光标&#xff0c;这样操作比较麻烦&#xff0c;效率也慢&#xff0c;如下提供一种方式&#xff0c;稍做配置&#xff0c;可以实现补齐输入后&#xff0c;直接按Enter回车键快速跳出…...

建行网站注册用户名怎么填/google关键词优化排名

郑重申明&#xff1a;本文纯属Fans同学的个人见解&#xff0c;不喜勿喷。 第1种境界&#xff1a;能够使用框架开发一个具体的项目。比如使用Struts2框架开发了一个博客系统。 第2种境界&#xff1a;不仅会使用框架&#xff0c;还知道框架内部的原理。比如在开发个人博客系统时&…...

怎么做网站界面分析/廊坊seo快速排名

一&#xff0c;介绍 本文介绍使用Kruskal算法求解无向图的最小生成树。Kruskal是一个贪心算法&#xff0c;并且使用了并查集这种数据结构。关于并查集的介绍&#xff0c;参考&#xff1a;数据结构--并查集的原理及实现 二&#xff0c;构造一个无向图 图&#xff0c;肯定有顶点和…...

专做国际时事评论网站/网络营销具有哪些特点

比如像比较简单的关键词“交流”、“心得”并没有可供选择的选项&#xff0c;怎么办&#xff1f;而且输入后按确定也没有用。 解决方法 可以直接在输入后回车&#xff0c;然后确定。 更新20200330 本篇博客的关键词可见&#xff1a;...