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

posted @   yzy2016  阅读(198)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
点击右上角即可分享
微信分享提示