flowable6.4使用oracle启动不能自动创建表的坑
程序员文章站
2022-07-04 20:19:00
...
spring-boot整合flowable,oracle数据库启动报错:
org.apache.ibatis.exceptions.PersistenceException:
### Error querying database. Cause: java.sql.SQLException: ORA-00942: 表或视图不存在
### The error may exist in org/flowable/db/mapping/entity/Property.xml
### The error may involve org.flowable.engine.impl.persistence.entity.PropertyEntityImpl.selectProperty-Inline
### The error occurred while setting parameters
### SQL: select * from ACT_ID_USER where ID_ = ?
### Cause: java.sql.SQLException: ORA-00942: 表或视图不存在
at org.apache.ibatis.exceptions.ExceptionFactory.wrapException(ExceptionFactory.java:30)
at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:150)
at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:141)
at org.apache.ibatis.session.defaults.DefaultSqlSession.selectOne(DefaultSqlSession.java:77)
at org.flowable.engine.common.impl.db.DbSqlSession.selectById(DbSqlSession.java:237)
,最后只生成几个act_id_开头的表:
很明显,初始化flowable自带表遇到错误意外终止。
检查了下配置:
configuration.setDataSource(dataSource);
configuration.setTransactionManager(transactionManager);
configuration.setDatabaseSchemaUpdate(ProcessEngineConfiguration.DB_SCHEMA_UPDATE_TRUE);
configuration.setActivityFontName("宋体");
configuration.setLabelFontName("宋体");
configuration.setAnnotationFontName("宋体");
configuration.setCustomSessionFactories(getCustomSessionFactories());
configuration.setAsyncExecutorAsyncJobAcquisitionEnabled(false);
configuration.setHistoryLevel(HistoryLevel.FULL);
configuration.setIdGenerator(uuidGenerator());
// 开启内嵌的微型V5引擎,兼容V5的流程定义数据
configuration.setFlowable5CompatibilityEnabled(true);
configuration.setFlowable5CompatibilityHandlerFactory(springFlowable5CompatibilityHandlerFactory());
这个应该是我们没有设置区分数据库用户Schema的问题,添加以下配置:
if (!CheckUtil.isNullorEmpty(defaultSchema))
{
configuration.setDatabaseSchema(defaultSchema);
}
这个defaultSchema,是通过配置文件注入进来:
@Value("${spring.jpa.properties.hibernate.default_schema:}")
private String defaultSchema;
这个时候,启动,觉得应该是可以的了,毕竟mysql没有区分用户Schema的问题,初始化都一直是ok的,可惜的是结果是残酷的,还是报了错:
这个错一看,应该就是oracle驱动的问题,后来经过排查,发现我们项目用的是ojdbc6,这个版本是没有提供setSchema()方法的,那我就往上找最新的版本试试,于是找到了ojdbc7,发现这个版本是有提供setSchema(),所有就升级到ojdb7,重新启动,成功了,表也自动创建了,问题得到了解决。
为此分享一下这个坑给大伙。