activiti6.0.0 二次开发兼容达梦数据库(亲测有效)
一、 前因
最近公司做数据库国产化,数据从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.Oracle10gDialect
show-sql: ture
然后再启动项目就不会报错了。。。亲测有效。有个改版的activiti-engine-6.0.0.jar直接替换用就行,嘻嘻嘻。
参考资料:https://blog.csdn.net/qq_42014561/article/details/128239874
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix