1.问题产生的原因:
由于自己采用的是mysql5.7版本且未做过多的配置,flowable自动生成的表全部是大写,个人不太习惯,就把flowable在mysql中对应的schema(数据库)的表全部删除,然后在my.cfg(windows可能是my.ini)这些配置文件中,加入限定表为小写的配置(在[mysqld]下加入lower_case_table_names=1,重启mysql服务)。 然后启动项目,结果出现
问题:
org.apache.ibatis.exceptions.PersistenceException: Error querying database. Cause: java.sql.SQLSyntaxErrorException: Table 'activiti.act_ge_property' doesn't existThe error may exist in org/activiti/db/mapping/entity/Property.xmlThe error may involve org.activiti.engine.impl.persistence.entity.PropertyEntity.selectProperty-InlineThe error occurred while setting parametersSQL: select * from ACT_GE_PROPERTY where NAME_ = ?Cause: java.sql.SQLSyntaxErrorException: Table 'activiti.act_ge_property' doesn't existat org.apache.ibatis.exceptions.ExceptionFactory.wrapException(ExceptionFactory.java:23)at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:107)at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:98)at org.apache.ibatis.session.defaults.DefaultSqlSession.selectOne(DefaultSqlSession.java:62)at org.activiti.engine.impl.db.DbSqlSession.selectById(DbSqlSession.java:466)at org.activiti.engine.impl.db.DbSqlSession.dbSchemaUpdate(DbSqlSession.java:1080)at org.activiti.engine.impl.db.DbSqlSession.performSchemaOperationsProcessEngineBuild(DbSqlSession.java:1473)at org.activiti.engine.impl.SchemaOperationsProcessEngineBuild.execute(SchemaOperationsProcessEngineBuild.java:25)at org.activiti.engine.impl.interceptor.CommandInvoker.execute(CommandInvoker.java:24)at org.activiti.engine.impl.interceptor.CommandContextInterceptor.execute(CommandContextInterceptor.java:57)at org.activiti.engine.impl.interceptor.LogInterceptor.execute(LogInterceptor.java:37)at org.activiti.engine.impl.cfg.CommandExecutorImpl.execute(CommandExecutorImpl.java:40)at org.activiti.engine.impl.ProcessEngineImpl.<init>(ProcessEngineImpl.java:77)at org.activiti.engine.impl.cfg.ProcessEngineConfigurationImpl.buildProcessEngine(ProcessEngineConfigurationImpl.java:427)at web.TestDemo.creteTable(TestDemo.java:209)at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)at java.lang.reflect.Method.invoke(Method.java:498)at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)at org.junit.runners.ParentRunner.run(ParentRunner.java:363)at org.junit.runner.JUnitCore.run(JUnitCore.java:137)at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:68)at com.intellij.rt.execution.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:47)at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:242)at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:70)
Caused by: java.sql.SQLSyntaxErrorException: Table 'activiti.act_ge_property' doesn't existat com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:120)at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:97)at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:122)at com.mysql.cj.jdbc.ClientPreparedStatement.executeInternal(ClientPreparedStatement.java:974)at com.mysql.cj.jdbc.ClientPreparedStatement.execute(ClientPreparedStatement.java:391)at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)at java.lang.reflect.Method.invoke(Method.java:498)at org.apache.ibatis.logging.jdbc.PreparedStatementLogger.invoke(PreparedStatementLogger.java:55)at com.sun.proxy.$Proxy6.execute(Unknown Source)at org.apache.ibatis.executor.statement.PreparedStatementHandler.query(PreparedStatementHandler.java:56)at org.apache.ibatis.executor.statement.RoutingStatementHandler.query(RoutingStatementHandler.java:70)at org.apache.ibatis.executor.SimpleExecutor.doQuery(SimpleExecutor.java:57)at org.apache.ibatis.executor.BaseExecutor.queryFromDatabase(BaseExecutor.java:259)at org.apache.ibatis.executor.BaseExecutor.query(BaseExecutor.java:132)at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:105)at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:81)at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:104)... 35 more
2.问题解决:
失败的删除数据库方案
(1) 找到mysql中创建的数据库(我这里是在连接工具navicat中进行的删除),比如我这的是flowable_test,之前是删除了表,现在我进行这个数据库(schema)删除,结果又出现一个问题
Error dropping database (can't rmdir './db'...)
失败的替换数据库方案
(2)提示数据库删除不了,好吧,新建一个数据库flowable,把项目中的配置改为这个,结果还是出现问题。
'activiti.act_ge_property' doesn't exist
失败的替换传递连接参数方案
(3)尝试网上的更改数据库连接,传递参数
在mysql的连接字符串中添加上nullCatalogMeansCurrent=true,将schema默认设置为当前连接的schema。
数据源配置
spring:datasource:driverClassName: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://127.0.0.1:3306/flowstudy?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf8&autoReconnect=true&&zeroDateTimeBehavior=convertToNull&useSSL=true&allowMulQueries=true&&nullCatalogMeansCurrent=trueusername: rootpassword: root
注意这个驱动信息driverClassName: com.mysql.cj.jdbc.Driver,mysql8.0驱动兼容mysql5.7的,而mysql5.7驱动的一般写法是
driver-class-name: com.mysql.jdbc.Driver,此处写8.0的驱动没问题,我导入的依赖包就是8.0版本的。
接着重新启动项目,结果失败!!
安装目录中删除mysql数据库文件夹
(4)实在不行了,祭杀招,找到mysql数据的安装地点,找到建立的数据库文件
夹(一般在data目录下),删除掉。windows中安装mysql的可以自行摸索,我安装在虚拟机的linux下,所以执行下列操作:
1)ps aux | grep mysql 列出mysql相关的信息
2) 找到datadir目录,在下列图片中可以看到,是在/var/lib/mysql下,进入该目录。执行命令cd /var/lib/mysql
3) ls
列出当前文件夹内的内容,可以看到很多数据库文件夹,我这里是蓝色的文件夹,
其实这些文件夹就是数据库内容,和下面这个对应
4)将之前出问题且在界面中删除不掉的flowable_test删除,执行
rm -rf ./flowable_test
成功后,在数据库连接工具中重新创建一个flowable_test(这个随意,和自己连接的一致就行)
4)然后重新启动项目 即可。(如果还是不行,可能是刚才项目中尝试连接了其他数据库,将之前尝试连接过的都删掉即可)
成功生成数据库表共70张,恩没有将流程设计器集成进来,表少了些,是正常的,在一般项目中也差不多是这个数(flowableb不同版本表的张数可能不同)。
是小写的表了,恩,看着顺眼多了!
![在这里插入图片描述](https://img-blog.csdnimg.cn/20201224133438476.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM0MTQ5MjIz,size_16,color_FFFFFF,t_70
特殊说明: 本人采用的springboot项目版本2.1.2.release,flowable版本是6.4.2,在springboot项目中,一般不会出现本篇文章所描述这种表不存在的初始化问题,预测是在数据库表创建好后,接着就删数据库表出现的问题。删flowable表时,先全选表,然后一般会删3-4次以上,每次越删越少,因为很多表是相互关联的。我当时是全选,然后删一次就全部删完了,接着项目启动就是失败了。
如有不足或疏漏之处请多指正,谢谢。