Skip to content

元数据驱动入库(persist-meta)

1.8.0 起(1.7.0 引入)随 module 提供(go get 同 module)

字段元数据(storageType)驱动的动态写入/读取——复杂表单(对象/JSON/子表)落库与 流程回显成为通用能力。规范见文档站《10 · 元数据驱动的动态写入/读取》;本页是 Go 语言视角。

元数据 JSON(persist-meta/biz_leave.json)

json
{
  "tableName": "biz_leave",
  "primaryKey": "id",
  "fields": [
    { "name": "companyName", "columnName": "company_name" },
    { "name": "address", "storageType": "EXPAND",
      "expandFields": { "province": "province", "city": "city", "detail": "detail_addr" } },
    { "name": "extra", "storageType": "JSON" },
    { "name": "items", "storageType": "ONE2MANY",
      "targetTable": "biz_leave_item", "foreignKey": "leave_id" }
  ]
}

storageType 支持名称("EXPAND")或数字(2,mldong dev_schema_field 1-5 语义)。

JSON 配置字段语义(顶层 + fields[],storageType 名称/数字双解析):

字段类型缺省语义
tableNamestring必填业务表名(应与 JSON 文件名一致)
primaryKeystringid主键列名(子表外键缺省回落它)
fields[].namestring必填表单字段名f_ 去前缀后的名字,如 f_titletitle
fields[].columnNamestringname 转下划线主表列名
fields[].storageTypestring | numberNORMALNORMAL(1) 直写 / EXPAND(2) 展开 / JSON(3) 序列化 / ONE2ONE(4) 子表单条 / ONE2MANY(5) 子表多条(对齐 mldong dev_schema_field)
fields[].expandFieldsobjectEXPAND 专用:子字段名 → 表列名映射
fields[].targetTablestringONE2ONE/ONE2MANY 专用:子表表名
fields[].foreignKeystring主表主键列名ONE2ONE/ONE2MANY 专用:子表外键列

装配(写侧 + 读侧)

go
provider := persist.NewJsonMetaProvider("persist-meta") // 文件系统目录

writer := persist.NewMetaTableWriter(persist.NewJdbcDynamicTableWriter(db), provider)
reader := persist.NewMetaTableReader(persist.NewJdbcTableReader(db), provider)

无元数据的表自动回落 1.6.x 行为(零破坏);IDynamicMetaProvider 也可自行实现。

回显

go
form, _ := reader.ReadByProcessInstance("biz_leave", processInstanceID)
// form["address"] = map{province, city, detail}   EXPAND 反展开
// form["extra"]   = map{tag, level}               JSON 反序列化
// form["items"]   = []interface{}{...}            ONE2MANY 子表组装

边界(不做):通用分页/条件/权限/排序。

1.8.0 增强(SYNC 同步演进协同)

  • 中途更新(update:按元数据 storageType 组装 SET 列——NORMAL/JSON/EXPAND 参与更新; ONE2ONE/ONE2MANY 子表不参与中途更新(SYNC 任务推进只更新主表行状态,子表数据变动走重新提交)
  • 子表系统用户字段:子表递归插入继承主表 apply_user_id(= 流程 operator, 子表单显式同名字段优先)——BIGINT create_user/update_user 列不再回落 "system" 严格模式报错
  • 回显去冗余:EXPAND 展开列(如 province/city)已消费为对象(address), 不再作为顶层平铺键重复带出

测试

bash
go test ./persist/   # 21 用例:JSON 加载 + 复杂 storageType 全链路读写 + 无元数据回落(SQLite 内存库)

jeeflow · 轻量级多语言工作流引擎