Activiti自动建表失败

最近一直在学习activiti的使用(为方便之后使用act代替activiti),在使用springboot整合activiti的时候,先引入依赖,然后配置SpringProcessEngineConfiguration类,设置了DatabaseSchemaUpdate的属性为true。总之就是在jar包和配置文件完全正确的情况下,编写test方法获取流程引擎失败。

报错信息如下

org.apache.ibatis.exceptions.PersistenceException: 
### Error querying database.  Cause: java.sql.SQLSyntaxErrorException: Table 'db_activiti.act_ge_property' doesn't exist
### 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: Table 'db_activiti.act_ge_property' doesn't exist

正常情况下,在实例化流程引擎的时候,当设置DatabaseSchemaUpdate的值为true时,act会验证数据库有没有建表,如果没有建表的话会自动帮我们建表。

从报错来看,是sql语法错误,db_activiti数据库下的act_ge_property不存在
为什么会出现这个问题呢,通过debug查看源码发现,activiti会先执行一条查询语句,看是否已经建过表了,如果数据库中没有act相关的表,执行org/activiti/db/create/activiti.mysql.create包下sql文件(根据数据库类型选择sql脚本),如果数据库有表了,进行下一步,检查数据库act表的版本和流程引擎的版本是否一致。而报错信息就出现在检查版本的sql中,提示要查询的表act_ge_property不存在

很奇怪,明明数据库中没有act的表,查询时却返回表已存在,继续查看源码,找到查询数据库表是否存在的sql:

SELECT TABLE_SCHEMA AS TABLE_CAT, NULL AS TABLE_SCHEM, TABLE_NAME, 
CASE WHEN TABLE_TYPE='BASE TABLE' THEN CASE WHEN TABLE_SCHEMA = 'mysql' OR TABLE_SCHEMA = 'performance_schema' 
THEN 'SYSTEM TABLE' ELSE 'TABLE' END WHEN TABLE_TYPE='TEMPORARY' THEN 'LOCAL_TEMPORARY' ELSE TABLE_TYPE END AS TABLE_TYPE,
 TABLE_COMMENT AS REMARKS, NULL AS TYPE_CAT, NULL AS TYPE_SCHEM, NULL AS TYPE_NAME, NULL AS SELF_REFERENCING_COL_NAME, NULL AS REF_GENERATION 
FROM INFORMATION_SCHEMA.TABLES 
WHERE TABLE_NAME LIKE 'ACT_RU_EXECUTION' 
HAVING TABLE_TYPE IN ('TABLE',null,null,null,null) ORDER BY TABLE_TYPE, TABLE_SCHEMA, TABLE_NAME

这就一目了然了,判断是否已建表的依据是查询是否存在 ACT_RU_EXECUTION 表,但是并不是从当前库db_activiti中查询的,而是从表INFORMATION_SCHEMA.TABLES中查询的,这是MySQL自带的表,保存元数据的。原来是我之前用过act,在自己的另外一个库中建过act的表,这些表信息存在
INFORMATION_SCHEMA.TABLES中,所以查询结果是表已经存在,但是表并不在当前库db_activiti中,后面查询act表版本的时候是查db_activiti库中的数据,表不存在,导致报错

终于找到问题,把另外一个库中act相关的表删除后,重新运行test方法,正常获取流程引擎,并在库里正常插入act相关表。

总结:在当前mysql服务器下已经有数据库中创建了act表的时候,在其他库中无法使用act流程引擎自动创建表。

这个真的有点坑人,不过通过上面的分析我们也可以很容易找到解决办法。在org/activiti/db/create/activiti.mysql.create包下找到对应数据库的sql脚本,自己手动执行脚本生成数据也是可以的。

你可能感兴趣的:(Activiti自动建表失败)