springboot初始化activiti表失败---另外一样原因

org.apache.ibatis.exceptions.PersistenceException:
### Error querying database. Cause: java.sql.SQLSyntaxErrorException: Table 'activiti.act_ge_property' doesn't exist
### The error may exist in org/activiti/db/mapping/entity/Property.xml
### The error may involve org.activiti.engine.impl.persistence.entity.PropertyEntityImpl.selectProperty-Inline
### The error occurred while setting parameters
### SQL: select * from ACT_GE_PROPERTY where NAME_ = ?
### Cause: java.sql.SQLSyntaxErrorException: Table 'activiti.act_ge_property' doesn't exist

引用-----半路出道晓码农 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脚本,自己手动执行脚本生成数据也是可以的。



作者:半路出道晓码农
链接:https://www.jianshu.com/p/48bf76856051/
来源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值