一、 前因
最近公司做数据库国产化,数据从MySql数据库中迁移到达梦(DM8),在迁移过程中,当迁移工作流(Activiti6.0.0)时,提换达梦(DM8)数据库驱动后启动过程报错:
Caused by: org.activiti.engine.ActivitiException: couldn't deduct database type from database product name 'DM DBMS'
二、 错误分析
Activiti6.0.0源码并不兼容达梦数据库:
在activiti-engine-6.0.0.jar在org.activiti.db.create sql下也没得dm sql语句:
所以,当启动项目时报:Caused by: org.activiti.engine.ActivitiException: couldn't deduct database type from database product name 'DM DBMS'。
三、 解决方案
activiti8版本以上据说可以兼容达梦数据库,小编没升级,不知道是否兼容,有待验证,哈哈。言归正传,要让Activiti6.0.0兼容达梦数据库,需要修改对应的源码,我们需要再项目中找到activiti-engine-6.0.0.jar这个jar包,找到下面需要修改的这几个类:ProcessEngineConfigurationImpl、DbSqlSession、DbSqlSessionFactory和AbstractQuery这个四个类。在本地项目里写一个路径一样、类名也一样的类来代替源码中的类运行。
3.1 修改ProcessEngineConfigurationImpl类
1、在org.activiti.engine.impl.cfg.ProcessEngineConfigurationImpl类,增加dm成员变量:
- public static final String DATABASE_TYPE_DM = "dm";
2、在org.activiti.engine.impl.cfg.ProcessEngineConfigurationImpl,修改getDefaultDatabaseTypeMappings():
- databaseTypeMappings.setProperty("dm", DATABASE_TYPE_DM);
- databaseTypeMappings.setProperty("DM DBMS",DATABAS E_TYPE_ORACLE);
3.2 修改DbSqlSessionFactory类
在org.activiti.engine.impl.db.DbSqlSessionFactory,修改initBulkInsertEnabledMap(String databaseType)添加:
"dm".equals(databaseType)。
3.3 修改DbSqlSession类
在org.activiti.engine.impl.db.DbSqlSession类里,借用oracle的sql文件来执行sql语句,具体做法:
// 当databaseType 为dm时,借用oracle的sql文件来代替执行if (ProcessEngineConfigurationImpl.DATABASE_TYPE_DM.equals(databaseType)) {databaseType = ProcessEngineConfigurationImpl.DATABASE_TYPE_ORACLE;}
3.4 修改AbstractQuery类
在 org.activiti.engine.impl.AbstractQuery,修改addOrder(String column, String sortOrder, NullHandlingOnOrder nullHandlingOnOrder)添加:
ProcessEngineConfigurationImpl.DATABASE_TYPE_DM.equals(databaseType)
3.5 解决无法访问javax.persistence.EntityManagerFactory报错
当完成上面的操作,启动项目报错:
java: 无法访问javax.persistence.EntityManagerFactory
找不到javax.persistence.EntityManagerFactory的类文件
需要在pom.xml添加依赖:
<!-- 2.2版本的persistence--><dependency><groupId>javax.persistence</groupId><artifactId>javax.persistence-api</artifactId></dependency><dependency><groupId>org.hibernate</groupId><artifactId>hibernate-core</artifactId><version>5.6.7.Final</version><exclusions><exclusion><groupId>commons-collections</groupId><artifactId>commons-collections</artifactId></exclusion></exclusions></dependency>
3.6 解决cannot be null when 'hibernate.dialect'报错
你以为完成上边的步骤就完事了?no,no,no,当你启动羡慕时报错:
Caused by: org.hibernate.HibernateException: Access to DialectResolutionInfo cannot be null when 'hibernate.dialect' not set
需要再配置文件里面添加:
spring:jpa:properties:hibernate:dialect: org.hibernate.dialect.Oracle10gDialectshow-sql: ture
然后再启动项目就不会报错了。。。亲测有效。有个改版的activiti-engine-6.0.0.jar直接替换用就行,嘻嘻嘻。
参考资料:https://blog.csdn.net/qq_42014561/article/details/128239874