Activiti+oracle 启动项目时不能自动建表或更新表的问题分析及解决办法

现象描述:按照正常配置,第一次启动时不能自动建表

关键配置片段如下:

<bean id="processEngineConfiguration" class="org.activiti.spring.SpringProcessEngineConfiguration">

<property name="dataSource" ref="dataSource" />

<property name="transactionManager" ref="transactionManager" />

<property name="databaseSchemaUpdate" value="true" />

<property name="jobExecutorActivate" value="true" />

</bean>

 

启动后报错:

 

### The error may exist in org/activiti/db/mapping/entity/Property.xml 

### The error may involve defaultParameterMap 

### The error occurred while setting parameters 

### SQL: select VALUE_ from ACT_GE_PROPERTY where NAME_ = 'schema.version' 

### Cause: java.sql.SQLSyntaxErrorException: ORA-00942: 表或视图不存在

 

经过调试分析,发现是关键判断表是否存在代码返回true值引起的,org.activiti.engine.impl.db.DbSqlSession.isTablePresent(String tableName);问题在于方法里面的schema=null,而连接的数据库实例下已经有另外一个用户activiti已经创建过表。

 

于是在引擎配置里面加入属性:

 

<property name="databaseSchema" value="act"/>

 

再启动,成功创建表。到此本以为问题已解决,停掉服务再次启动,失败,报建表错误:对象已存在。调试发现isTablePresent返回的还是false(表还未创建)。

 

发现是大小写问题,最后改成

 

<property name="databaseSchema" value="ACT"/>

 

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
如果 Activiti 没有启动流程,那么任务也不会被创建和分配给相应的用户或组。因此,你不能获取到还不存在的任务。 如果你想获取流程定义中的任务节点信息,可以使用 Activiti 的 API 获取任务节点的信息,例如任务名称、任务处理人等。你可以通过以下代码获取当前流程定义中所有任务节点的信息: ```java ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery() .processDefinitionKey("processDefinitionKey") .singleResult(); BpmnModel bpmnModel = repositoryService.getBpmnModel(processDefinition.getId()); Collection<FlowElement> flowElements = bpmnModel.getMainProcess().getFlowElements(); for (FlowElement flowElement : flowElements) { if (flowElement instanceof UserTask) { UserTask userTask = (UserTask) flowElement; System.out.println("Task Name: " + userTask.getName()); System.out.println("Task Assignee: " + userTask.getAssignee()); System.out.println("Task Candidate Groups: " + userTask.getCandidateGroups()); System.out.println("Task Candidate Users: " + userTask.getCandidateUsers()); } } ``` 上述代码中,我们首先使用 `repositoryService` 对象获取指定流程定义的 `ProcessDefinition` 对象,然后使用 `repositoryService` 对象获取流程定义的 `BpmnModel` 对象,通过 `BpmnModel` 对象可以获取流程定义中的所有节点信息。在循环处理节点信息,我们只处理 `UserTask` 类型的节点,获取任务的名称、处理人和候选人等信息。 需要注意的是,上述代码只能获取流程定义中的任务节点信息,而不能获取已经创建的任务信息。如果需要获取已经创建的任务信息,可以使用 Activiti 的 API 查询已经创建的任务,例如: ```java List<Task> tasks = taskService.createTaskQuery() .processDefinitionKey("processDefinitionKey") .taskAssignee("user") .list(); for (Task task : tasks) { System.out.println("Task Name: " + task.getName()); System.out.println("Task Assignee: " + task.getAssignee()); System.out.println("Task Candidate Groups: " + task.getCandidateGroups()); System.out.println("Task Candidate Users: " + task.getCandidateUsers()); } ``` 上述代码中,我们使用 `taskService` 对象创建了一个查询任务的查询对象,通过指定任务的处理人、流程定义的标识等条件来查询已经创建的任务。在循环处理任务信息,我们同样可以获取任务的名称、处理人和候选人等信息。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值