文/朱季謙
Activiti工作流引擎自帶了一套數據庫表,這里面有一個需要注意的地方:
低於5.6.4的MySQL版本不支持時間戳或毫秒級的日期。更糟糕的是,某些版本在嘗試創建此類列時將引發異常,而其他版本則不會。執行自動創建/升級時,引擎將在執行DDL時更改它。使用DDL文件方法時,既可以使用常規版本也可以使用其中帶有mysql55的特殊文件(這適用於低於5.6.4的任何版本)。后一個文件將具有沒有毫秒精度的列類型。
筆者曾經在5.6.0版本做過試驗,發現是無法自動生成23張表的,但在5.6.4版本以上便可,因此,最好保證mysql版本在5.6.4以上。
一.數據庫表名稱說明
Activiti的數據庫表分5大部分,名稱以ACT開頭,第二部分是表用例的兩個字符的標志,該用例與服務API的大致匹配:
二.ACT_GE_ *通用數據表
通用數據表用於存放一些通用的數據,這些表本身不關心特定的流程或者業務,只用於存放這些業務或者流程所使用的資源。通用數據表有兩個,分別是ACT_GE_BYTEARRAY與ACT_GE_PROPERTY,它們都是以ACT_GE_*開頭的。
2.1 ACT_GE_BYTEARRAY資源表
表ACT_GE_BYTEARRAY資源表用於保存於流程引擎相關的資源,流程文件進行部署時,流程定義的圖片以及XML文件等數據,都會轉換成byte數組保存到這個表中。該表設計了一個byte字段,用來保存資源的內容,該表包含以下字段:
注:Activiti為了保證整個流程引擎表中所產生的數據主鍵在整個流程引擎中是唯一的,使用了一個DbIdGenerator類生成主鍵,該類中保存了下一條數據的ID值和當前ID塊最后一個ID值。
2.2 ACT_GE_PROPERTY屬性表
Activiti將全部的屬性抽象為key-value對,每個屬性都有名稱和值。
注:在初始化流程數據庫時,會默認加入3條屬性數據:next.dbid、schema.history和schema.version。
next.dbid:屬性值為1時,表示Activiti數據庫表ID生成時,當前ID塊最大值為1(即數據庫里還沒有任何數據)。前面也提到,流程引擎是使用一個DbIdGenerator類來生成主鍵的,該類保存了下一條數據的ID值和當前ID塊的最后一個ID值,所謂ID塊就是Activiti數據產生時ID值時,就會從1開始到101進行取值作為數據ID,那么該ID塊的最大值為101。DbIdGenerator在產生數據ID時,會判斷當前ID值是否大於101(ID塊最大值)。如果大於,則請求重新生成一個ID塊,那么此時屬性中的next.dbid屬性值將會為201。
schema.history:屬性表示數據表結構的更新歷史,例如——
create(5.22.0.0)即表示使用了5.22版本的初始化腳本創建。
schema.version:表示當前Activiti數據結構的版本。
三.ACT_RE_ *流程存儲表
存儲表名稱以ACT_RE開頭,RE是repository單詞的前兩個字母,流程使用存儲表來保存流程定義和部署信息相關的數據。
3.1.ACT_RE_DEPLOYMENT部署數據表
在流程引擎中,一次部署可以添加多個資源,即可以有圖片與XML之類的資源,這些資源數據會保存到資源表(ACT_GE_BTYEARRAY),剩余部署信息,則保存到部署表中,部署名為ACT_RE_DEPLOYMENT,包含以下三個字段:
3.2.ACT_RE_PROCDEF流程定義表
Activiti在部署流程文件時(.bpmn或者.bpmn20.xml),其除了會將內容保存到資源表外,還會解析流程文件的內容,形成特定的流程定義數據,寫入到流程定義表(ACT_RE_PROCDEF)中,該表包含了以下的字段:
注:該表的主鍵與其他數據表不同的是,ACT_RE_PROCDEF表的主鍵是組合主鍵,其值為流程定義的KEY_字段值加流程定義的VERSION_字段值再加ID生成器生成的ID值,其中這三個值以冒號為分隔符。例如,KEY_值為baoxiaoProcess,VERSION_值為1,ID生成器生成的ID值為722504,則該主鍵為baoxiaoProcess:1:722504,如以下截圖所示:
四.ACT_ID_ *身份數據表
Activiti的整個身份證數據模塊,可以獨立於流程引擎而存在,身份數據表並沒有保存流程相關的數據以及關聯,身份表名稱使用ACT_ID關聯,ID是單詞identity的前兩個字母。
4.1.ACD_ID_USER用戶表
流程引擎用戶的信息被保存在ACT_ID_USER表中,該表有以下字段:
4.2.ACD_ID_GROUP用戶組表
使用ACT_ID_GROUP表來保存用戶組的數據,該表有以下幾個字段:
4.3.ACD_ID_MEMBERSHIP關系表
關系表用來描述用戶表與用戶組表的對應關系:
注:該表的兩個字段均做了外鍵約束,寫入該表的數據時,必須要有用戶和用戶組數據與之關聯。
五.ACT_RU_ *運行時數據表
運行時數據表用來保存流程在運行過程中所產生的數據,例如流程實例、執行流和任務等,以ACT_RU開頭,RU是單詞runtime的前兩個字母。
5.1.ACT_RU_EXECUTION流程實例表
流程啟動后,會產生一個流程實例,同時產生相應的執行流,流程實例和執行流數據均被保存在ACT_RU_EXECUTION表中。如果一個流程實例只要一條執行流,那么該表中只產生一條數據,該數據既表示執行流,也表示流程實例。
5.2.ACT_RU_TASK流程任務表
流程在運行過程中所產生的任務數據保存在ACT_RU_TASK,字段如下:
5.3.ACT_RU_VARIABLE流程參數表
流程引擎提供了ACT_RU_VARIABLE表來存放流程中的參數,這類參數包括流程實例參數、執行流參數和任務參數,各參數可以有多種類型。
5.4.ACT_RU_IDENTITYLINK流程與身份關系表
用戶組與用戶之間存在的關系,使用ACT_ID_MEMBERSHIP表保存。用戶或者用戶組與流程數據之間的關系,則使用ACT_RU_IDENTITYLINK表進行保存。
5.5.ACT_RU_JOB工作數據表
在流程執行的過程中,會有一些工作需要定時或者重復執行,這類工作數據被保存到ACT_RU_JOB表中。
5.6.ACT_RU_EVENT_SUBSCR事件描述表
如果流程到達某類事件節點,Activiti會往ACT_RU_EVENT_SUBSCR表中加入事件描述數據,這些事件描述數據將會決定流程事件的觸發。
六.ACT_HI_ *歷史數據表
歷史數據表就像流程引擎的日志表。被操作過的流程元素,將會被記錄到李四表中。歷史表名稱以ACT_HI開頭,HI是單詞history的前兩個字母。
6.1.ACT_HI_PROCINST流程實例表
流程實例的歷史數據會被保存到ACT_HI_PROCINST表中,只要流程啟動,Activiti就會將流程實例的數據寫入ACT_HI_PROCINST表中。除了基本的流程字段外,與運行時數據表不同的是,歷史流程實例表還會記錄流程的開始活動ID的、活動結束ID等信息。
6.2.ACT_HI_ACTINST歷史行為表
歷史行為表會記錄每一個流程活動的實例,一個 流程活動將會被記錄成一條數據,例如,流程中有開始事件,用戶任務,結束事件各一個,當流程結束后,該表就會產生3條歷史行為數據。
6.3.附件表ACT_HI_ATTACHMENT
使用任務服務(TaskService)的API,可以添加附件,這些附件數據將會保存到ACT_HI_ATTACHMENT表中。
6.4.評論表ACT_HI_COMMENT
可以專門存放審批過程中的評論數據。