数据表总览¶
平台数据表按模块组织为独立文档(本目录),本文保留整体分类、命名规范与生成机制。
平台支持多种数据库:MySQL、Oracle、PostgreSQL、SQL Server、KingBase、OceanBase、DM、DB2、HSQLDB/H2、Oscar。连接池使用 Druid(com.alibaba.druid)。
系统表¶
系统库以 JPA 或 Hibernate 作为 ORM,启动时通过 ddl-auto=update 自动创建/增量更新表结构(仅新增,不删除)。
基础配置见 obpm-common/src/main/resources/application-base.properties:
spring.jpa.database=mysql
spring.jpa.hibernate.ddl-auto=update
spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
两类映射方式并存:
- Hibernate
*.hbm.xml映射(旧体系):usercenter 模块的 PO,如UserVO.hbm.xml、DepartmentVO.hbm.xml、DomainVO.hbm.xml、Form.hbm.xml - JPA
@Entity注解(新模块):KMS、AI、Message、Logger 等
系统表与运行时静态表(T_ 前缀、代码定义)的逐表列结构见各模块文档;动态表(TLK_/LOG_/PARM_)机制见本文下半部分。
模块文档索引¶
| 文档 | 模块 | 表前缀 |
|---|---|---|
| [[usercenter-tables]] | obpm-usercenter | T_ |
| [[signon-tables]] | obpm-signon | T_(与 usercenter 共表) |
| [[core-tables]] | obpm-core | T_(表单定义 + 运行时静态表) |
| [[kms-tables]] | obpm-kms | KMS_ |
| [[ai-tables]] | obpm-ai | ai_ |
| [[message-tables]] | obpm-message | mc_ |
| [[logger-tables]] | obpm-logger | T_ |
动态表¶
前缀 TLK_XXX 表 / LOG_XXX 表 / PARM_XXX 表。每个表单(Form)保存时会自动生成对应数据库表,用于存储该表单的业务数据——这是 OBPM 低代码平台的核心特性。
前缀常量定义于 obpm-core/src/main/java/cn/myapps/core/runtime/dynaform/document/dql/DQLASTUtil.java:
| 前缀 | 类型常量 | 用途 | 生成条件 |
|---|---|---|---|
TLK_ |
TABEL_TYPE_CONTENT (1) |
表单业务数据存储表(最常见) | 普通表单(FORM_TYPE_NORMAL)保存 |
LOG_ |
TABEL_TYPE_LOG (2) |
表单数据变更历史表 | 表单开启 showLog=true |
PARM_ |
TABLE_TYPE_PARM (4) |
流程参数表 | 流程参数表单(FORM_TYPE_FLOW_PARAMETER) |
命名规则:前缀 + 表单名(form.name),全大写。例如表单 Leave → TLK_LEAVE、LOG_LEAVE。
列结构¶
每张动态表由 4 部分列组成:
① 固定列(所有动态表共有,来自 ChangeLog.getFixedColumns()):
| 列名 | 类型 | 说明 |
|---|---|---|
| PARENT | VARCHAR | 父文档 ID |
| LASTMODIFIED | TIMESTAMP | 最后修改时间 |
| FORMNAME | VARCHAR | 表单名称 |
| STATE | VARCHAR | 流程状态 |
| AUDITUSER | VARCHAR | 审批人 |
| AUDITDATE | TIMESTAMP | 审批时间 |
| AUTHOR | VARCHAR | 创建人 |
| AUTHORDEPTID | VARCHAR | 创建人部门 ID |
| AUTHOR_DEPT_INDEX | VARCHAR(2000) | 创建人部门索引 |
| AUTHOR_USER_INDEX | VARCHAR(2000) | 创建人索引 |
| CREATED | TIMESTAMP | 创建时间 |
| FORMID | VARCHAR | 表单 ID |
| SUBFORMIDS | CLOB | 子表单 ID 列表 |
| INITIATOR | VARCHAR | 发起人 |
| ISTMP | BIT | 是否临时文档 |
| VERSIONS | INTEGER | 版本号 |
| APPLICATIONID | VARCHAR | 应用 ID |
| STATEINT | INTEGER | 状态码 |
| STATELABEL | VARCHAR | 状态标签 |
| AUDITORNAMES | CLOB | 审批人姓名列表 |
| LASTFLOWOPERATION | VARCHAR | 最近流程操作 |
| LASTMODIFIER | VARCHAR | 最后修改人 |
| DOMAINID | VARCHAR | 域 ID |
| AUDITORLIST | CLOB | 审批人 ID 列表 |
| COAUDITORLIST | CLOB | 协办人列表 |
| STATELABELINFO | CLOB | 状态标签信息 |
| PREVAUDITNODE | CLOB | 上一审批节点 |
| PREVAUDITUSER | CLOB | 上一审批人 |
| OPTIONITEM | CLOB | 选项项 |
| SIGN | CLOB | 签名 |
| KINGGRIDSIGNATURE | CLOB | 金格签名 |
| SECRET | VARCHAR | 密级 |
② 业务字段列:表单中每个字段对应一列,列名 = ITEM_ + 字段名(大写),如字段 reason → ITEM_REASON。以 $ 开头的系统字段不加 ITEM_ 前缀,也不建列(在 compareFieldsToAddOrModify 中被跳过)。
③ 主键列:由表单配置的主键名决定(TableMapping.getPrimaryKeyName()),类型为 VARCHAR。
④ LOG 表额外列:DOC_ID(VARCHAR,关联 T_DOCUMENT.ID),仅 LOG_ 表有。
生成机制¶
表单保存时触发动态表创建/更新,调用链:
FormDesignTimeServiceImpl.save/update(设计时服务入口)FormTableProcessBean.createDynaTable/createOrUpdateDynaTableAbstractFormTableDAO.createDynaTableChangeLog.compare对比新旧表单结构,生成变更日志AbstractTableDefinition.processChanges执行 DDLSQLBuilder(如MysqlBuilder)生成数据库特定 SQL- JDBC
Statement批量执行
各数据库的 DDL 实现位于 obpm-core/src/main/java/cn/myapps/core/designtime/table/ddlutil/<db>/,每个数据库目录包含三件套:
| 数据库 | SQLBuilder | TableDefinition | Validator |
|---|---|---|---|
| MySQL | MysqlBuilder |
MysqlTableDefinition |
MysqlValidator |
| Oracle | OracleBuilder |
OracleTableDefinition |
OracleValidator |
| PostgreSQL | PostgreSQLBuilder |
PostgreSQLTableDefinition |
PostgreSQLValidator |
| SQL Server | MssqlBuilder |
MssqlTableDefinition |
MssqlValidator |
| KingBase | KingBaseBuilder |
KingBaseDefinition |
KingBaseValidator |
| OceanBase | OceanBaseBuilder |
OceanBaseDefinition |
OceanBaseValidator |
| DM | DmSQLBuilder |
DmSQLTableDefinition |
DmSQLValidator |
| DB2 | DB2Builder |
DB2TableDefinition |
DB2Validator |
| HSQLDB/H2 | HsqldbBuilder |
HsqldbTableDefinition |
HsqldbValidator |
| Oscar | OscarBuilder |
OscarTableDefinition |
OscarValidator |
数据关联¶
T_DOCUMENT.MAPPINGID → TLK_<表单名>.ID:文档头通过映射 ID 指向动态表主键,实现文档元数据与业务数据的分离存储。
动态表的读写由 AbstractDocStaticTblDAO 及其各数据库子类实现(MysqlDocStaticTblDAO、OracleDocStaticTblDAO、PostgreSQLDocStaticTblDAO 等),由 createDocument(doc, tabelType) 的 tabelType 参数决定写入 TLK_ 表(类型 1)还是 LOG_ 表(类型 2)。
表结构总览¶
flowchart LR
A["<b>系统表</b>(T_ / KMS_ / ai_ / mc_,JPA/Hibernate 管理)<br/>用户:T_USER / T_DEPARTMENT / T_DOMAIN / T_ACCOUNT<br/>表单定义:T_DYNAFORM_FORM<br/>KMS / AI / Message / Logger …"]
B["<b>静态表</b>(T_ 前缀,代码定义,AbstractApplicationInitDAO)<br/>T_DOCUMENT(文档头,核心)<br/>流程:T_FLOWSTATERT / T_ACTORRT / T_NODERT /<br/> T_FLOWHISTORY / T_RELATIONHIS …<br/>其他:T_UPLOAD / T_TRIGGER / T_COUNTER …"]
C["<b>动态表</b>(运行时按表单生成,DDL 代码生成)<br/>TLK_<表单名>:业务数据(每表单一张)<br/>LOG_<表单名>:变更历史(可选)<br/>PARM_<表单名>:流程参数"]
A -->|"表单定义保存后生成"| B
B -->|"T_DOCUMENT.MAPPINGID 关联"| C