Activiti6.0.0拓展支持的数据库,以达梦为例子

起因

工作流基本环境的搭建在此就不做过多的赘述了,在达梦的官微也介绍了如何在activiti上如何结合,但是结合的方式过于死板,如果想通过xml来配置使用何种数据库,正好你又看到了这篇文章,那么可能会节省你半天的时间。

注意,这里所有从jar包中copy出来的源码,仍然需要放在一个新建的重复路径下,方便编译的时候覆盖jar中的class文件

首先

org.activiti.engine.impl.cfg.ProcessEngineConfigurationImpl这个类,从它的jar包中copy出来,然后在

 	public static final String DATABASE_TYPE_H2 = "h2";
    public static final String DATABASE_TYPE_HSQL = "hsql";
    public static final String DATABASE_TYPE_MYSQL = "mysql";
    public static final String DATABASE_TYPE_ORACLE = "oracle";
    public static final String DATABASE_TYPE_POSTGRES = "postgres";
    public static final String DATABASE_TYPE_MSSQL = "mssql";
    public static final String DATABASE_TYPE_DB2 = "db2";

下面加上要支持的数据库简称,方便在xml中配置datasourceType

public static final String DATABASE_TYPE_DM = "dm";

当然还得继续在getDefaultDatabaseTypeMappings()方法中加上如下这句话:

databaseTypeMappings.setProperty("dm", DATABASE_TYPE_DM);

接着

接下来,这些配好了,如何映射sql文件呢,请看org.activiti.engine.impl.db.DbSqlSessionFactory类中的initBulkInsertEnabledMap(String databaseType)方法,发现下面有

 		// Only Oracle is making a fuss in one specific case right now
        if ("oracle".equals(databaseType)) {
            bulkInsertableMap.put(EventLogEntryEntityImpl.class, Boolean.FALSE);
        }

这样一句代码,而且还标识是oracle独有的,由于我适配的是达梦,所以在这里修改为

		if ("oracle".equals(databaseType) || "dm".equals(databaseType)) {
            bulkInsertableMap.put(EventLogEntryEntityImpl.class, Boolean.FALSE);
        }

还有

org.activiti.engine.impl.AbstractQuery类中也需要把addOrder(String column, String sortOrder, NullHandlingOnOrder nullHandlingOnOrder)中

 			if (nullHandlingOnOrder.equals(NullHandlingOnOrder.NULLS_FIRST)) {

                if (ProcessEngineConfigurationImpl.DATABASE_TYPE_H2.equals(databaseType) || ProcessEngineConfigurationImpl.DATABASE_TYPE_HSQL.equals(databaseType)
                        || ProcessEngineConfigurationImpl.DATABASE_TYPE_POSTGRES.equals(databaseType) || ProcessEngineConfigurationImpl.DATABASE_TYPE_ORACLE.equals(databaseType)) {
                    orderBy = orderBy + defaultOrderByClause + " NULLS FIRST";
                } else if (ProcessEngineConfigurationImpl.DATABASE_TYPE_MYSQL.equals(databaseType)) {
                    orderBy = orderBy + "isnull(" + column + ") desc," + defaultOrderByClause;
                } else if (ProcessEngineConfigurationImpl.DATABASE_TYPE_DB2.equals(databaseType) || ProcessEngineConfigurationImpl.DATABASE_TYPE_MSSQL.equals(databaseType)) {
                    orderBy = orderBy + "case when " + column + " is null then 0 else 1 end," + defaultOrderByClause;
                } else {
                    orderBy = orderBy + defaultOrderByClause;
                }

            } else if (nullHandlingOnOrder.equals(NullHandlingOnOrder.NULLS_LAST)) {

                if (ProcessEngineConfigurationImpl.DATABASE_TYPE_H2.equals(databaseType) || ProcessEngineConfigurationImpl.DATABASE_TYPE_HSQL.equals(databaseType)
                        || ProcessEngineConfigurationImpl.DATABASE_TYPE_POSTGRES.equals(databaseType) || ProcessEngineConfigurationImpl.DATABASE_TYPE_ORACLE.equals(databaseType)) {
                    orderBy = orderBy + column + " " + sortOrder + " NULLS LAST";
                } else if (ProcessEngineConfigurationImpl.DATABASE_TYPE_MYSQL.equals(databaseType)) {
                    orderBy = orderBy + "isnull(" + column + ") asc," + defaultOrderByClause;
                } else if (ProcessEngineConfigurationImpl.DATABASE_TYPE_DB2.equals(databaseType) || ProcessEngineConfigurationImpl.DATABASE_TYPE_MSSQL.equals(databaseType)) {
                    orderBy = orderBy + "case when " + column + " is null then 1 else 0 end," + defaultOrderByClause;
                } else {
                    orderBy = orderBy + defaultOrderByClause;
                }
            }

修改为

           if (nullHandlingOnOrder.equals(NullHandlingOnOrder.NULLS_FIRST)) {

                if (ProcessEngineConfigurationImpl.DATABASE_TYPE_H2.equals(databaseType) || ProcessEngineConfigurationImpl.DATABASE_TYPE_HSQL.equals(databaseType)
                        || ProcessEngineConfigurationImpl.DATABASE_TYPE_POSTGRES.equals(databaseType) || ProcessEngineConfigurationImpl.DATABASE_TYPE_ORACLE.equals(databaseType)
                        || ProcessEngineConfigurationImpl.DATABASE_TYPE_DM.equals(databaseType)) {
                    orderBy = orderBy + defaultOrderByClause + " NULLS FIRST";
                } else if (ProcessEngineConfigurationImpl.DATABASE_TYPE_MYSQL.equals(databaseType)) {
                    orderBy = orderBy + "isnull(" + column + ") desc," + defaultOrderByClause;
                } else if (ProcessEngineConfigurationImpl.DATABASE_TYPE_DB2.equals(databaseType) || ProcessEngineConfigurationImpl.DATABASE_TYPE_MSSQL.equals(databaseType)) {
                    orderBy = orderBy + "case when " + column + " is null then 0 else 1 end," + defaultOrderByClause;
                } else {
                    orderBy = orderBy + defaultOrderByClause;
                }

            } else if (nullHandlingOnOrder.equals(NullHandlingOnOrder.NULLS_LAST)) {

                if (ProcessEngineConfigurationImpl.DATABASE_TYPE_H2.equals(databaseType) || ProcessEngineConfigurationImpl.DATABASE_TYPE_HSQL.equals(databaseType)
                        || ProcessEngineConfigurationImpl.DATABASE_TYPE_POSTGRES.equals(databaseType) || ProcessEngineConfigurationImpl.DATABASE_TYPE_ORACLE.equals(databaseType)
                        || ProcessEngineConfigurationImpl.DATABASE_TYPE_DM.equals(databaseType)) {
                    orderBy = orderBy + column + " " + sortOrder + " NULLS LAST";
                } else if (ProcessEngineConfigurationImpl.DATABASE_TYPE_MYSQL.equals(databaseType)) {
                    orderBy = orderBy + "isnull(" + column + ") asc," + defaultOrderByClause;
                } else if (ProcessEngineConfigurationImpl.DATABASE_TYPE_DB2.equals(databaseType) || ProcessEngineConfigurationImpl.DATABASE_TYPE_MSSQL.equals(databaseType)) {
                    orderBy = orderBy + "case when " + column + " is null then 1 else 0 end," + defaultOrderByClause;
                } else {
                    orderBy = orderBy + defaultOrderByClause;
                }
            }

接下来

接下来需要把sql建表脚本放好,由于我是web项目,放置于resources的org.activiti.db下,按照acitivit-engine包下的结构放置,原因是这句话:

properties.load(getResourceAsStream("org/activiti/db/properties/"+databaseType+".properties"));

找不到会报空指针异常。

如果

如果发生noSuchMethod的异常,要记住把org.activiti.engine.impl.ProcessEngineImpl沾出来一份,重新给它写一下

this.formEngineFormService = processEngineConfiguration.getFormEngineFormService();

这句话,可能会报错,修改为

this.formEngineFormService = (org.activiti.form.api.FormService) processEngineConfiguration.getFormEngineFormService();

至此,拓展完毕,如果有其他国产数据库拓展经验的小伙伴可以给我留言哦,不胜感激。

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
是的,Activiti 5.2.2 可以兼容达梦数据库Activiti 是一个轻量级的开源工作流引擎,它支持与不同的关系型数据库进行集成。达梦数据库是一种关系型数据库管理系统,它拥有自己的特定规范和语法。 为了使 Activiti 兼容达梦数据库,您需要完成以下步骤: 1. 首先,您需要下载并安装适用于 Activiti达梦 JDBC 驱动程序。您可以在达梦官方网站上找到该驱动程序的下载链接。 2. 安装完驱动程序后,您需要在 Activiti 的配置文件中进行一些必要的更改。在 Activiti 的配置文件中,您需要指定使用达梦数据库和相应的连接信息,如数据库 URL、用户名和密码等。您还需要将达梦数据库的驱动类路径配置在 Activiti 的类路径中。 3. 此外,您还需要确保 Activiti 的版本与所使用的达梦 JDBC 驱动程序兼容。为了解决潜在的兼容性问题,您可以查阅 Activiti达梦数据库的官方文档,以获得更多关于版本兼容性的信息。 完成上述步骤后,您应该能够将 Activiti 集成到达梦数据库中,并使用其提供的工作流功能。请注意,在使用达梦数据库之前,您需要熟悉该数据库的语法和特性,以确保您的操作能够顺利进行。 总而言之,Activiti 5.2.2 可以兼容达梦数据库,但在集成和使用过程中可能需要注意一些细节,如安装适用于 Activiti达梦 JDBC 驱动程序、配置数据库连接信息等。通过正确完成这些步骤,您应该能够顺利地将 Activiti达梦数据库集成,并使用其提供的工作流引擎功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值