Activiti6.0数据库表分析

本文通过分析一个简单的请假流程,详细阐述了Activiti6.0在流程不同阶段与数据库表之间的交互,涉及流程定义、发布、请假申请、审批等过程,揭示了Activiti在流程实例化、审批状态变更时数据库表数据的变化情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文以一个简单的请假流程为例,分析在流程在流转的过程中,Activiti相关表数据的变化,从而深入学习Activiti。

1.流程定义

流程图如下:


具体配置如下,领导审批任务中提交的result值,会在网关进行判断,如果为false,则打回到开始的StartEvent。

<?xml version="1.0" encoding="UTF-8"?>
<definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:activiti="http://activiti.org/bpmn" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:omgdc="http://www.omg.org/spec/DD/20100524/DC" xmlns:omgdi="http://www.omg.org/spec/DD/20100524/DI" typeLanguage="http://www.w3.org/2001/XMLSchema" expressionLanguage="http://www.w3.org/1999/XPath" targetNamespace="http://activiti.org/bpmn20" id="review-definitions">
  <process id="sysTakeLeave" name="Review And Approve Activiti Process" isExecutable="true">
    <startEvent id="startevent1" name="Start">
      <extensionElements>
        <activiti:formProperty id="staffId" name="员工" type="string"></activiti:formProperty>
      </extensionElements>
    </startEvent>
    <userTask id="applyLeaveTask" name="请假申请" activiti:candidateUsers="${staffId}">
      <extensionElements>
        <activiti:formProperty id="reason" name="原因" type="string" required="true"></activiti:formProperty>
      </extensionElements>
    </userTask>
    <sequenceFlow id="flow1" sourceRef="startevent1" targetRef="applyLeaveTask"></sequenceFlow>
    <exclusiveGateway id="exclusivegateway1" name="审批是否通过" default="approved"></exclusiveGateway>
    <sequenceFlow id="flow2" sourceRef="reviewLeaveTask" targetRef="exclusivegateway1"></sequenceFlow>
    <endEvent id="endevent1" name="End"></endEvent>
    <sequenceFlow id="approved" name="审批通过" sourceRef="exclusivegateway1" targetRef="endevent1"></sequenceFlow>
    <sequenceFlow id="refused" name="拒绝" sourceRef="exclusivegateway1" targetRef="startevent1">
      <conditionExpression xsi:type="tFormalExpression"><![CDATA[${!result}]]></conditionExpression>
    </sequenceFlow>
    <userTask id="reviewLeaveTask" name="领导审批" activiti:candidateUsers="${leaveService.getManagerIds(staffId)}">
      <extensionElements>
        <activiti:formProperty id="managerId" name="经理" type="string" required="true"></activiti:formProperty>
        <activiti:formProperty id="result" name="结果" type="boolean">
          <activiti:value id="true" name="同意"></activiti:value>
          <activiti:value id="false" name="不同意"></activiti:value>
        </activiti:formProperty>
      </extensionElements>
    </userTask>
    <sequenceFlow id="flow5" sourceRef="applyLeaveTask" targetRef="reviewLeaveTask"></sequenceFlow>
  </process>
  <bpmndi:BPMNDiagram id="BPMNDiagram_sysTakeLeave">
    <bpmndi:BPMNPlane bpmnElement="sysTakeLeave" id="BPMNPlane_sysTakeLeave">
      <bpmndi:BPMNShape bpmnElement="startevent1" id="BPMNShape_startevent1">
        <omgdc:Bounds height="35.0" width="35.0" x="90.0" y="151.0"></omgdc:Bounds>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape bpmnElement="applyLeaveTask" id="BPMNShape_applyLeaveTask">
        <omgdc:Bounds height="55.0" width="105.0" x="210.0" y="141.0"></omgdc:Bounds>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape bpmnElement="exclusivegateway1" id="BPMNShape_exclusivegateway1">
        <omgdc:Bounds height="40.0" width="40.0" x="520.0" y="148.0"></omgdc:Bounds>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape bpmnElement="endevent1" id="BPMNShape_endevent1">
        <omgdc:Bounds height="35.0" width="35.0" x="605.0" y="151.0"></omgdc:Bounds>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape bpmnElement="reviewLeaveTask" id="BPMNShape_reviewLeaveTask">
        <omgdc:Bounds height="55.0" width="105.0" x="370.0" y="141.0"></omgdc:Bounds>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNEdge bpmnElement="flow1" id="BPMNEdge_flow1">
        <omgdi:waypoint x="125.0" y="168.0"></omgdi:waypoint>
        <omgdi:waypoint x="210.0" y="168.0"></omgdi:waypoint>
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge bpmnElement="flow2" id="BPMNEdge_flow2">
        <omgdi:waypoint x="475.0" y="168.0"></omgdi:waypoint>
        <omgdi:waypoint x="52
<think>我们正在讨论Activiti 6.0如何扩展支持OSCAR神通数据库。根据引用[^1],虽然资料不多,但国产数据库大多仿照Oracle,因此整合方法类似。下面我将分步骤说明扩展支持的方法。 步骤1:了解数据库兼容性 由于神通数据库(OSCAR)与Oracle高度兼容,我们可以参考Activiti对Oracle的支持来实现。Activiti使用数据库类型(如oracle)来标识不同的数据库,并在SQL映射文件中使用对应的SQL语句。 步骤2:修改数据库类型标识 在Activiti中,需要为神通数据库创建一个新的数据库类型(例如"oscar")。这通常在`org.activiti.engine.impl.db.DbSqlSessionFactory`类中配置。我们需要添加一个数据库类型到`databaseTypeMappings`中。 步骤3:创建对应的SQL映射文件 Activiti使用XML文件来定义不同数据库的SQL语句。我们需要为神通数据库创建一套SQL映射文件。由于神通数据库与Oracle兼容,我们可以基于Oracle的SQL映射文件进行修改。 例如,在`activiti-engine`模块的`src/main/resources/org/activiti/db/mapping`目录下,复制`oracle`文件夹并重命名为`oscar`,然后修改其中的XML文件,确保SQL语法符合神通数据库的要求。 步骤4:修改数据库连接配置 在Activiti的配置文件(如`activiti.cfg.xml`)中,需要指定数据库类型为自定义的"oscar",并设置相应的JDBC驱动和连接字符串。 示例配置: ```xml <bean id="processEngineConfiguration" class="org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration"> <property name="jdbcUrl" value="jdbc:oscar://localhost:2003/OSRDB" /> <property name="jdbcDriver" value="com.oscar.Driver" /> <property name="jdbcUsername" value="username" /> <property name="jdbcPassword" value="password" /> <property name="databaseType" value="oscar" /> <!-- 其他配置 --> </bean> ``` 步骤5:注册自定义的数据库类型 我们需要在Activiti引擎初始化时注册自定义的数据库类型。可以通过扩展`org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration`类来实现。 示例代码: ```java public class OscarProcessEngineConfiguration extends StandaloneProcessEngineConfiguration { @Override public void initDatabaseType() { super.initDatabaseType(); // 注册自定义数据库类型 if ("oscar".equals(databaseType)) { databaseType = "oscar"; // 设置对应的数据库特定配置,例如分页语法等 } } } ``` 然后在配置中使用这个自定义的配置类: ```xml <bean id="processEngineConfiguration" class="com.yourcompany.OscarProcessEngineConfiguration"> ... <!-- 同上配置 --> </bean> ``` 步骤6:处理分页查询 如果神通数据库的分页机制与Oracle不同,需要调整分页SQL。Activiti的分页查询在`org.activiti.engine.impl.Page`类中使用,我们需要在SQL映射文件中使用神通数据库的分页语法(例如,使用LIMIT和OFFSET,或者类似于Oracle的ROWNUM,具体取决于神通数据库的版本)。 例如,在`oscar`目录下的SQL映射文件中,将分页查询改为神通数据库支持的语法。 步骤7:测试 完成上述步骤后,需要全面测试Activiti的功能,包括流程部署、启动、任务查询等,确保与神通数据库的兼容性。 注意:由于Activiti 6.0版本较老,可能需要对部分代码进行调整。同时,确保使用神通数据库的JDBC驱动,并将其添加到项目依赖中。 以上步骤是基于Activiti的扩展机制来支持新的数据库。如果遇到具体问题,可能需要深入调试。 相关问题: 1. Activiti 6.0支持哪些国产数据库? 2. 如何为Activiti添加新的数据库支持? 3. 神通数据库与Oracle在SQL语法上有哪些主要差异?</think>要在 Activiti 6.0 中扩展支持 OSCAR 神通数据库,需进行以下关键步骤,基于国产数据库与 Oracle 的高度兼容性进行适配[^1]: ### 一、核心配置步骤 1. **数据库驱动集成** 在项目中添加 OSCAR JDBC 驱动依赖(示例 Maven 配置): ```xml <dependency> <groupId>com.oscar</groupId> <artifactId>oscar-jdbc</artifactId> <version>9.0</version> <!-- 根据实际版本调整 --> </dependency> ``` 2. **修改数据库连接配置** 在 `activiti.cfg.xml` 中配置 OSCAR 连接: ```xml <bean id="processEngineConfiguration" class="org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration"> <property name="jdbcUrl" value="jdbc:oscar://localhost:2003/OSRDB" /> <property name="jdbcDriver" value="com.oscar.Driver" /> <property name="databaseType" value="oracle" /> <!-- 利用Oracle兼容性 --> ... <!-- 其他标准配置 --> </bean> ``` 3. **自定义 SQL 映射**(关键步骤) 创建 `src/main/resources/org/activiti/db/mapping` 目录,复制 Oracle 的 SQL 映射文件(如 `create.engine.oracle.sql`),修改以下内容: ```sql /* 示例:修改分页语法 */ -- 原始Oracle语法 SELECT * FROM ( SELECT rownum rn, temp.* FROM (...) temp ) WHERE rn > #{start} AND rn <= #{end} -- 改为OSCAR兼容语法 SELECT * FROM (...) LIMIT #{end} OFFSET #{start} ``` ### 二、源码级适配 1. **扩展 `DatabaseMetaData` 处理** 继承 `OracleDbSchemaManager` 覆盖方言方法: ```java public class OscarDbSchemaManager extends OracleDbSchemaManager { @Override public String getTableName(String tableName) { return tableName.toUpperCase(); // OSCAR默认大写名 } @Override public String getDatabaseTablePrefix() { return ""; // 根据实际需求调整前缀 } } ``` 2. **注册自定义数据库类型** 在 `ProcessEngineConfigurationImpl` 中添加类型映射: ```java public class OscarProcessEngineConfiguration extends StandaloneProcessEngineConfiguration { static { // 添加OSCAR到数据库类型映射 dbSqlSessionFactory.registerDatabaseType("oscar", OscarDbSchemaManager.class); } } ``` ### 三、部署验证 1. **启动时检查日志** 确认输出以下关键信息: ``` Database type: oracle (实际使用OSCAR但标记为Oracle兼容) JDBC driver: com.oscar.Driver Creating schema: ACT_RE_* 创建成功 ``` 2. **执行测试流程** 部署一个包含 `ServiceTask` 的 BPMN 流程,验证: ```java repositoryService.createDeployment() .addClasspathResource("test-process.bpmn20.xml") .deploy(); ``` ### 四、常见问题解决 1. **数据类型转换错误** ```log Caused by: java.sql.SQLException: 不支持的 TIMESTAMP 类型 ``` **解决方案**:在 SQL 映射文件中将 `TIMESTAMP` 改为 `DATE` 2. **序列生成冲突** ```log ORA-02289: 序列不存在 (Oracle错误码映射) ``` **解决方案**:在 `OscarDbSchemaManager` 中重写 `getNextSequenceValue` 方法,使用 OSCAR 的 `NEXTVAL('SEQ_NAME')` 语法 3. **连接池配置** 建议使用 DBCP 连接池避免兼容性问题: ```xml <property name="dataSource"> <bean class="org.apache.commons.dbcp.BasicDataSource"> <property name="driverClassName" value="com.oscar.Driver"/> <property name="url" value="jdbc:oscar://IP:PORT/DBNAME"/> </bean> </property> ``` > **重要提示**:由于 Activiti 6.0 已停止维护,建议测试所有核心功能(历史数据存储、异步任务、事务回滚),如遇复杂问题可考虑升级到 Activiti 7.x 或使用商业支持版本。 --- ### 相关问题 1. 神通数据库与 Oracle 的 SQL 语法有哪些主要差异需要特别注意? 2. 如何为 Activiti 设计跨数据库的自动化测试方案? 3. 在国产化环境中部署 Activiti 时,如何优化数据库连接性能?
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值