Flowable6.8 (común a la versión 6.x) integra los detalles de la base de datos Dameng 8 (DM8) y resuelve el problema de los errores de sintaxis de tablas relacionadas con dmn cuando se generan tablas automáticamente.

Flowable integra la base de datos de Dameng 8

Creo que la mayoría de la gente es como yo, pensando que basta con cambiar la fuente de datos. Al principio, solo cambié la fuente de datos y encendí la función de creación automática de tablas.

spring:
  datasource:
    url: jdbc:dm://127.0.0.1:5236?SCHEMA=FLOWABLE
    username: FLOWABLE
    password: 123456
    driver-class-name: dm.jdbc.driver.DmDriver
    type: com.alibaba.druid.pool.DruidDataSource

flowable:
  #关闭定时任务JOB
  async-executor-activate: false
  database-schema-update: true
server:
  port: 8081

Pero la consola informa de un error al ejecutar

Caused by: org.flowable.common.engine.api.FlowableException: couldn’t deduct database type from database product name ‘DM DBMS’

Según la documentación oficial de Flowable, Flowable admite una variedad de bases de datos, incluidas H2, Hsql, MySQL, Oracle, PostgreSQL, Microsoft SQL Server, etc. Sin embargo, según la documentación oficial de Flowable, la base de datos Dameng no es compatible actualmente.

solución:

Referencia: https://blog.csdn.net/qq_37829708/article/details/124978212?spm=1001.2014.3001.5506
Consejos en la primera fila: si no hay solución de acuerdo con los pasos, puede consultar el resumen de mi blog, que puede tener un plan de solución.

Excluya las dependencias de liquibase en pom.xml y especifique una versión para evitar actualizaciones posteriores. Probé dos versiones 4.3.5 y 4.9.1, y la creación de tablas se ejecuta normalmente al inicio. Siempre que sea una versión 4.x , debe ser común.

<!--flowable工作流依赖-->
<dependency>
    <groupId>org.flowable</groupId>
    <artifactId>flowable-spring-boot-starter</artifactId>
    <version>6.8.0</version>
    <exclusions>
        <exclusion>
            <groupId>org.liquibase</groupId>
            <artifactId>liquibase-core</artifactId>
        </exclusion>
    </exclusions>
</dependency>
<!--数据库变更版本控制工具liquibase依赖-->
<dependency>
    <groupId>org.liquibase</groupId>
    <artifactId>liquibase-core</artifactId>
	<version>4.9.1</version>
</dependency>

Modificar el código fuente de Flowable

  1. Modifique org.flowable.common.engine.impl.AbstractEngineConfigurationla clase, la ubicación del código fuente es la siguiente:
    inserte la descripción de la imagen aquí
    Aquí, la clase del código fuente se reescribe sobrescribiéndola, lo que evita el problema de volver a empaquetar. Cree org.flowable.common.engine.impl.AbstractEngineConfigurationuna clase en el proyecto y copie todo el código en el código fuente a esta clase .
    inserte la descripción de la imagen aquí
    Modificar getDefaultDatabaseTypeMappingsmétodo después de la creación.
public static Properties getDefaultDatabaseTypeMappings() {
    
    
    Properties databaseTypeMappings = new Properties();
    databaseTypeMappings.setProperty("H2", DATABASE_TYPE_H2);
    databaseTypeMappings.setProperty("HSQL Database Engine", DATABASE_TYPE_HSQL);
    databaseTypeMappings.setProperty("MySQL", DATABASE_TYPE_MYSQL);
    databaseTypeMappings.setProperty("MariaDB", DATABASE_TYPE_MYSQL);
    databaseTypeMappings.setProperty("Oracle", DATABASE_TYPE_ORACLE);
    databaseTypeMappings.setProperty(PRODUCT_NAME_POSTGRES, DATABASE_TYPE_POSTGRES);
    databaseTypeMappings.setProperty("Microsoft SQL Server", DATABASE_TYPE_MSSQL);
    databaseTypeMappings.setProperty(DATABASE_TYPE_DB2, DATABASE_TYPE_DB2);
    databaseTypeMappings.setProperty("DB2", DATABASE_TYPE_DB2);
    databaseTypeMappings.setProperty("DB2/NT", DATABASE_TYPE_DB2);
    databaseTypeMappings.setProperty("DB2/NT64", DATABASE_TYPE_DB2);
    databaseTypeMappings.setProperty("DB2 UDP", DATABASE_TYPE_DB2);
    databaseTypeMappings.setProperty("DB2/LINUX", DATABASE_TYPE_DB2);
    databaseTypeMappings.setProperty("DB2/LINUX390", DATABASE_TYPE_DB2);
    databaseTypeMappings.setProperty("DB2/LINUXX8664", DATABASE_TYPE_DB2);
    databaseTypeMappings.setProperty("DB2/LINUXZ64", DATABASE_TYPE_DB2);
    databaseTypeMappings.setProperty("DB2/LINUXPPC64", DATABASE_TYPE_DB2);
    databaseTypeMappings.setProperty("DB2/LINUXPPC64LE", DATABASE_TYPE_DB2);
    databaseTypeMappings.setProperty("DB2/400 SQL", DATABASE_TYPE_DB2);
    databaseTypeMappings.setProperty("DB2/6000", DATABASE_TYPE_DB2);
    databaseTypeMappings.setProperty("DB2 UDB iSeries", DATABASE_TYPE_DB2);
    databaseTypeMappings.setProperty("DB2/AIX64", DATABASE_TYPE_DB2);
    databaseTypeMappings.setProperty("DB2/HPUX", DATABASE_TYPE_DB2);
    databaseTypeMappings.setProperty("DB2/HP64", DATABASE_TYPE_DB2);
    databaseTypeMappings.setProperty("DB2/SUN", DATABASE_TYPE_DB2);
    databaseTypeMappings.setProperty("DB2/SUN64", DATABASE_TYPE_DB2);
    databaseTypeMappings.setProperty("DB2/PTX", DATABASE_TYPE_DB2);
    databaseTypeMappings.setProperty("DB2/2", DATABASE_TYPE_DB2);
    databaseTypeMappings.setProperty("DB2 UDB AS400", DATABASE_TYPE_DB2);
    databaseTypeMappings.setProperty(PRODUCT_NAME_CRDB, DATABASE_TYPE_COCKROACHDB);
    databaseTypeMappings.setProperty("DM DBMS", DATABASE_TYPE_ORACLE); // 新增内容
    return databaseTypeMappings;
}
  1. FlowableSi no hay una tabla relacionada en la versión inferior dmn, no hay necesidad de realizar este paso. Como soy 6.8una versión, se han agregado muchas otras funciones. Al crear dmnuna tabla relacionada al inicio, hay un paso para cambiar el nombre de la tabla. Dameng no admite esta sintaxis:
    inserte la descripción de la imagen aquí
    Solución: agregue un nuevo archivo en el directorio
    , copie el contenido en el código fuente, elimine la etiqueta con id 7 y luego asigne el siguiente contenido a la ubicación correspondiente:resourceorg/flowable/dmn/db/liquibase/custom-flowable-dmn-db-changelog.xmlchangeSet
<changeSet id="7" author="flowable" dbms="!dm">

        <dropIndex tableName="ACT_DMN_DECISION_TABLE" indexName="ACT_IDX_DEC_TBL_UNIQ"/>

        <renameTable
                newTableName="ACT_DMN_DECISION"
                oldTableName="ACT_DMN_DECISION_TABLE"/>

        <createIndex tableName="ACT_DMN_DECISION" indexName="ACT_IDX_DMN_DEC_UNIQ" unique="true">
            <column name="KEY_" />
            <column name="VERSION_" />
            <column name="TENANT_ID_" />
        </createIndex>

    </changeSet>

    <changeSet id="7" author="flowable" dbms="dm">
        <dropIndex tableName="ACT_DMN_DECISION_TABLE" indexName="ACT_IDX_DEC_TBL_UNIQ"/>
        <sql>
            CREATE TABLE ACT_DMN_DECISION AS SELECT * FROM ACT_DMN_DECISION_TABLE;
        </sql>
        <sql>
            DROP TABLE ACT_DMN_DECISION_TABLE;
        </sql>
        <createIndex tableName="ACT_DMN_DECISION" indexName="ACT_IDX_DMN_DEC_UNIQ" unique="true">
            <column name="KEY_" />
            <column name="VERSION_" />
            <column name="TENANT_ID_" />
        </createIndex>
    </changeSet>

Cree la clase DmnDbSchemaManager debajo javadel archivo, la ruta completa es org.flowable.dmn.engine.impl.db.DmnDbSchemaManager, copie el código fuente a la clase que creó y LIQUIBASE_CHANGELOGcambie la ruta de enlace a la custom-flowable-dmn-db-changelog.xmlruta del archivo creado anteriormente.
inserte la descripción de la imagen aquí
Donde se encuentra el código fuente de los cambios anteriores, copie el código fuente correspondiente al archivo que creó.
inserte la descripción de la imagen aquí

Modificar el código fuente de Liquibase

  1. Cree una clase en javala carpeta DmDatabase, la ruta completa es liquibase.database.core.DmDatabase, consulte liquibase.database.core.OracleDatabasela clase y pegue el siguiente código directamente en la clase recién creada.

    Los cambios introducidos por el autor en esta clase son los siguientes:

    1. elimine el método setConnection;
    2. Modifique el valor constante de PRODUCT_NAME a "DM DBMS";
    3. Modifique el método getDefaultPort para que devuelva 5236;
    4. Modifique el método getShortName para devolver dm;
    5. Modifique el método getDefaultDriver para devolver el controlador de Dameng;
package liquibase.database.core;

import java.lang.reflect.Method;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.Properties;
import java.util.Set;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import liquibase.CatalogAndSchema;
import liquibase.Scope;
import liquibase.database.AbstractJdbcDatabase;
import liquibase.database.DatabaseConnection;
import liquibase.database.OfflineConnection;
import liquibase.database.jvm.JdbcConnection;
import liquibase.exception.DatabaseException;
import liquibase.exception.UnexpectedLiquibaseException;
import liquibase.exception.ValidationErrors;
import liquibase.executor.ExecutorService;
import liquibase.statement.DatabaseFunction;
import liquibase.statement.SequenceCurrentValueFunction;
import liquibase.statement.SequenceNextValueFunction;
import liquibase.statement.core.RawCallStatement;
import liquibase.statement.core.RawSqlStatement;
import liquibase.structure.DatabaseObject;
import liquibase.structure.core.Catalog;
import liquibase.structure.core.Index;
import liquibase.structure.core.PrimaryKey;
import liquibase.structure.core.Schema;
import liquibase.util.JdbcUtils;
import liquibase.util.StringUtil;

public class DmDatabase extends AbstractJdbcDatabase {
    
    
    private static final String PRODUCT_NAME = "DM DBMS";

    @Override
    protected String getDefaultDatabaseProductName() {
    
    
        return PRODUCT_NAME;
    }

    /**
     * Is this AbstractDatabase subclass the correct one to use for the given connection.
     *
     * @param conn
     */
    @Override
    public boolean isCorrectDatabaseImplementation(DatabaseConnection conn) throws DatabaseException {
    
    
        return PRODUCT_NAME.equalsIgnoreCase(conn.getDatabaseProductName());
    }

    /**
     * If this database understands the given url, return the default driver class name.  Otherwise return null.
     *
     * @param url
     */
    @Override
    public String getDefaultDriver(String url) {
    
    
        if(url.startsWith("jdbc:dm")) {
    
    
            return "dm.jdbc.driver.DmDriver";
        }

        return null;
    }

    /**
     * Returns an all-lower-case short name of the product.  Used for end-user selecting of database type
     * such as the DBMS precondition.
     */
    @Override
    public String getShortName() {
    
    
        return "dm";
    }

    @Override
    public Integer getDefaultPort() {
    
    
        return 5236;
    }

    /**
     * Returns whether this database support initially deferrable columns.
     */
    @Override
    public boolean supportsInitiallyDeferrableColumns() {
    
    
        return true;
    }

    @Override
    public boolean supportsTablespaces() {
    
    
        return true;
    }

    @Override
    public int getPriority() {
    
    
        return PRIORITY_DEFAULT;
    }

    private static final Pattern PROXY_USER = Pattern.compile(".*(?:thin|oci)\\:(.+)/@.*");

    protected final int SHORT_IDENTIFIERS_LENGTH = 30;
    protected final int LONG_IDENTIFIERS_LEGNTH = 128;
    public static final int ORACLE_12C_MAJOR_VERSION = 12;

    private Set<String> reservedWords = new HashSet<>();
    private Set<String> userDefinedTypes;
    private Map<String, String> savedSessionNlsSettings;

    private Boolean canAccessDbaRecycleBin;
    private Integer databaseMajorVersion;
    private Integer databaseMinorVersion;

    /**
     * Default constructor for an object that represents the Oracle Database DBMS.
     */
    public DmDatabase() {
    
    
        super.unquotedObjectsAreUppercased = true;
        //noinspection HardCodedStringLiteral
        super.setCurrentDateTimeFunction("SYSTIMESTAMP");
        // Setting list of Oracle's native functions
        //noinspection HardCodedStringLiteral
        dateFunctions.add(new DatabaseFunction("SYSDATE"));
        //noinspection HardCodedStringLiteral
        dateFunctions.add(new DatabaseFunction("SYSTIMESTAMP"));
        //noinspection HardCodedStringLiteral
        dateFunctions.add(new DatabaseFunction("CURRENT_TIMESTAMP"));
        //noinspection HardCodedStringLiteral
        super.sequenceNextValueFunction = "%s.nextval";
        //noinspection HardCodedStringLiteral
        super.sequenceCurrentValueFunction = "%s.currval";
    }

    private void tryProxySession(final String url, final Connection con) {
    
    
        Matcher m = PROXY_USER.matcher(url);
        if (m.matches()) {
    
    
            Properties props = new Properties();
            props.put("PROXY_USER_NAME", m.group(1));
            try {
    
    
                Method method = con.getClass().getMethod("openProxySession", int.class, Properties.class);
                method.setAccessible(true);
                method.invoke(con, 1, props);
            } catch (Exception e) {
    
    
                Scope.getCurrentScope().getLog(getClass()).info("Could not open proxy session on OracleDatabase: " + e.getCause().getMessage());
            }
        }
    }

    @Override
    public int getDatabaseMajorVersion() throws DatabaseException {
    
    
        if (databaseMajorVersion == null) {
    
    
            return super.getDatabaseMajorVersion();
        } else {
    
    
            return databaseMajorVersion;
        }
    }

    @Override
    public int getDatabaseMinorVersion() throws DatabaseException {
    
    
        if (databaseMinorVersion == null) {
    
    
            return super.getDatabaseMinorVersion();
        } else {
    
    
            return databaseMinorVersion;
        }
    }

    @Override
    public String getJdbcCatalogName(CatalogAndSchema schema) {
    
    
        return null;
    }

    @Override
    public String getJdbcSchemaName(CatalogAndSchema schema) {
    
    
        return correctObjectName((schema.getCatalogName() == null) ? schema.getSchemaName() : schema.getCatalogName(), Schema.class);
    }

    @Override
    protected String getAutoIncrementClause(final String generationType, final Boolean defaultOnNull) {
    
    
        if (StringUtil.isEmpty(generationType)) {
    
    
            return super.getAutoIncrementClause();
        }

        String autoIncrementClause = "GENERATED %s AS IDENTITY"; // %s -- [ ALWAYS | BY DEFAULT [ ON NULL ] ]
        String generationStrategy = generationType;
        if (Boolean.TRUE.equals(defaultOnNull) && generationType.toUpperCase().equals("BY DEFAULT")) {
    
    
            generationStrategy += " ON NULL";
        }
        return String.format(autoIncrementClause, generationStrategy);
    }

    @Override
    public String generatePrimaryKeyName(String tableName) {
    
    
        if (tableName.length() > 27) {
    
    
            //noinspection HardCodedStringLiteral
            return "PK_" + tableName.toUpperCase(Locale.US).substring(0, 27);
        } else {
    
    
            //noinspection HardCodedStringLiteral
            return "PK_" + tableName.toUpperCase(Locale.US);
        }
    }

    @Override
    public boolean isReservedWord(String objectName) {
    
    
        return reservedWords.contains(objectName.toUpperCase());
    }

    @Override
    public boolean supportsSequences() {
    
    
        return true;
    }

    /**
     * Oracle supports catalogs in liquibase terms
     *
     * @return false
     */
    @Override
    public boolean supportsSchemas() {
    
    
        return false;
    }

    @Override
    protected String getConnectionCatalogName() throws DatabaseException {
    
    
        if (getConnection() instanceof OfflineConnection) {
    
    
            return getConnection().getCatalog();
        }
        try {
    
    
            //noinspection HardCodedStringLiteral
            return Scope.getCurrentScope().getSingleton(ExecutorService.class).getExecutor("jdbc", this).queryForObject(new RawCallStatement("select sys_context( 'userenv', 'current_schema' ) from dual"), String.class);
        } catch (Exception e) {
    
    
            //noinspection HardCodedStringLiteral
            Scope.getCurrentScope().getLog(getClass()).info("Error getting default schema", e);
        }
        return null;
    }

    @Override
    public String getDefaultCatalogName() {
    
    //NOPMD
        return (super.getDefaultCatalogName() == null) ? null : super.getDefaultCatalogName().toUpperCase(Locale.US);
    }

    /**
     * <p>Returns an Oracle date literal with the same value as a string formatted using ISO 8601.</p>
     *
     * <p>Convert an ISO8601 date string to one of the following results:
     * to_date('1995-05-23', 'YYYY-MM-DD')
     * to_date('1995-05-23 09:23:59', 'YYYY-MM-DD HH24:MI:SS')</p>
     * <p>
     * Implementation restriction:<br>
     * Currently, only the following subsets of ISO8601 are supported:<br>
     * <ul>
     * <li>YYYY-MM-DD</li>
     * <li>YYYY-MM-DDThh:mm:ss</li>
     * </ul>
     */
    @Override
    public String getDateLiteral(String isoDate) {
    
    
        String normalLiteral = super.getDateLiteral(isoDate);

        if (isDateOnly(isoDate)) {
    
    
            return "TO_DATE(" + normalLiteral + ", 'YYYY-MM-DD')";
        } else if (isTimeOnly(isoDate)) {
    
    
            return "TO_DATE(" + normalLiteral + ", 'HH24:MI:SS')";
        } else if (isTimestamp(isoDate)) {
    
    
            return "TO_TIMESTAMP(" + normalLiteral + ", 'YYYY-MM-DD HH24:MI:SS.FF')";
        } else if (isDateTime(isoDate)) {
    
    
            int seppos = normalLiteral.lastIndexOf('.');
            if (seppos != -1) {
    
    
                normalLiteral = normalLiteral.substring(0, seppos) + "'";
            }
            return "TO_DATE(" + normalLiteral + ", 'YYYY-MM-DD HH24:MI:SS')";
        }
        return "UNSUPPORTED:" + isoDate;
    }

    @Override
    public boolean isSystemObject(DatabaseObject example) {
    
    
        if (example == null) {
    
    
            return false;
        }

        if (this.isLiquibaseObject(example)) {
    
    
            return false;
        }

        if (example instanceof Schema) {
    
    
            //noinspection HardCodedStringLiteral,HardCodedStringLiteral,HardCodedStringLiteral,HardCodedStringLiteral
            if ("SYSTEM".equals(example.getName()) || "SYS".equals(example.getName()) || "CTXSYS".equals(example.getName()) || "XDB".equals(example.getName())) {
    
    
                return true;
            }
            //noinspection HardCodedStringLiteral,HardCodedStringLiteral,HardCodedStringLiteral,HardCodedStringLiteral
            if ("SYSTEM".equals(example.getSchema().getCatalogName()) || "SYS".equals(example.getSchema().getCatalogName()) || "CTXSYS".equals(example.getSchema().getCatalogName()) || "XDB".equals(example.getSchema().getCatalogName())) {
    
    
                return true;
            }
        } else if (isSystemObject(example.getSchema())) {
    
    
            return true;
        }
        if (example instanceof Catalog) {
    
    
            //noinspection HardCodedStringLiteral,HardCodedStringLiteral,HardCodedStringLiteral,HardCodedStringLiteral
            if (("SYSTEM".equals(example.getName()) || "SYS".equals(example.getName()) || "CTXSYS".equals(example.getName()) || "XDB".equals(example.getName()))) {
    
    
                return true;
            }
        } else if (example.getName() != null) {
    
    
            //noinspection HardCodedStringLiteral
            if (example.getName().startsWith("BIN$")) {
    
     //oracle deleted table
                boolean filteredInOriginalQuery = this.canAccessDbaRecycleBin();
                if (!filteredInOriginalQuery) {
    
    
                    filteredInOriginalQuery = StringUtil.trimToEmpty(example.getSchema().getName()).equalsIgnoreCase(this.getConnection().getConnectionUserName());
                }

                if (filteredInOriginalQuery) {
    
    
                    return !((example instanceof PrimaryKey) || (example instanceof Index) || (example instanceof
                            liquibase.statement.UniqueConstraint));
                } else {
    
    
                    return true;
                }
            } else //noinspection HardCodedStringLiteral
                if (example.getName().startsWith("AQ$")) {
    
     //oracle AQ tables
                    return true;
                } else //noinspection HardCodedStringLiteral
                    if (example.getName().startsWith("DR$")) {
    
     //oracle index tables
                        return true;
                    } else //noinspection HardCodedStringLiteral
                        if (example.getName().startsWith("SYS_IOT_OVER")) {
    
     //oracle system table
                            return true;
                        } else //noinspection HardCodedStringLiteral,HardCodedStringLiteral
                            if ((example.getName().startsWith("MDRT_") || example.getName().startsWith("MDRS_")) && example.getName().endsWith("$")) {
    
    
                                // CORE-1768 - Oracle creates these for spatial indices and will remove them when the index is removed.
                                return true;
                            } else //noinspection HardCodedStringLiteral
                                if (example.getName().startsWith("MLOG$_")) {
    
     //Created by materliaized view logs for every table that is part of a materialized view. Not available for DDL operations.
                                    return true;
                                } else //noinspection HardCodedStringLiteral
                                    if (example.getName().startsWith("RUPD$_")) {
    
     //Created by materialized view log tables using primary keys. Not available for DDL operations.
                                        return true;
                                    } else //noinspection HardCodedStringLiteral
                                        if (example.getName().startsWith("WM$_")) {
    
     //Workspace Manager backup tables.
                                            return true;
                                        } else //noinspection HardCodedStringLiteral
                                            if ("CREATE$JAVA$LOB$TABLE".equals(example.getName())) {
    
     //This table contains the name of the Java object, the date it was loaded, and has a BLOB column to store the Java object.
                                                return true;
                                            } else //noinspection HardCodedStringLiteral
                                                if ("JAVA$CLASS$MD5$TABLE".equals(example.getName())) {
    
     //This is a hash table that tracks the loading of Java objects into a schema.
                                                    return true;
                                                } else //noinspection HardCodedStringLiteral
                                                    if (example.getName().startsWith("ISEQ$$_")) {
    
     //System-generated sequence
                                                        return true;
                                                    } else //noinspection HardCodedStringLiteral
                                                        if (example.getName().startsWith("USLOG$")) {
    
     //for update materialized view
                                                            return true;
                                                        } else if (example.getName().startsWith("SYS_FBA")) {
    
     //for Flashback tables
                                                            return true;
                                                        }
        }

        return super.isSystemObject(example);
    }

    @Override
    public boolean supportsAutoIncrement() {
    
    
        // Oracle supports Identity beginning with version 12c
        boolean isAutoIncrementSupported = false;

        try {
    
    
            if (getDatabaseMajorVersion() >= 12) {
    
    
                isAutoIncrementSupported = true;
            }

            // Returning true will generate create table command with 'IDENTITY' clause, example:
            // CREATE TABLE AutoIncTest (IDPrimaryKey NUMBER(19) GENERATED BY DEFAULT AS IDENTITY NOT NULL, TypeID NUMBER(3) NOT NULL, Description NVARCHAR2(50), CONSTRAINT PK_AutoIncTest PRIMARY KEY (IDPrimaryKey));

            // While returning false will continue to generate create table command without 'IDENTITY' clause, example:
            // CREATE TABLE AutoIncTest (IDPrimaryKey NUMBER(19) NOT NULL, TypeID NUMBER(3) NOT NULL, Description NVARCHAR2(50), CONSTRAINT PK_AutoIncTest PRIMARY KEY (IDPrimaryKey));

        } catch (DatabaseException ex) {
    
    
            isAutoIncrementSupported = false;
        }

        return isAutoIncrementSupported;
    }


//    public Set<UniqueConstraint> findUniqueConstraints(String schema) throws DatabaseException {
    
    
//        Set<UniqueConstraint> returnSet = new HashSet<UniqueConstraint>();
//
//        List<Map> maps = new Executor(this).queryForList(new RawSqlStatement("SELECT UC.CONSTRAINT_NAME, UCC.TABLE_NAME, UCC.COLUMN_NAME FROM USER_CONSTRAINTS UC, USER_CONS_COLUMNS UCC WHERE UC.CONSTRAINT_NAME=UCC.CONSTRAINT_NAME AND CONSTRAINT_TYPE='U' ORDER BY UC.CONSTRAINT_NAME"));
//
//        UniqueConstraint constraint = null;
//        for (Map map : maps) {
    
    
//            if (constraint == null || !constraint.getName().equals(constraint.getName())) {
    
    
//                returnSet.add(constraint);
//                Table table = new Table((String) map.get("TABLE_NAME"));
//                constraint = new UniqueConstraint(map.get("CONSTRAINT_NAME").toString(), table);
//            }
//        }
//        if (constraint != null) {
    
    
//            returnSet.add(constraint);
//        }
//
//        return returnSet;
//    }

    @Override
    public boolean supportsRestrictForeignKeys() {
    
    
        return false;
    }

    @Override
    public int getDataTypeMaxParameters(String dataTypeName) {
    
    
        //noinspection HardCodedStringLiteral
        if ("BINARY_FLOAT".equals(dataTypeName.toUpperCase())) {
    
    
            return 0;
        }
        //noinspection HardCodedStringLiteral
        if ("BINARY_DOUBLE".equals(dataTypeName.toUpperCase())) {
    
    
            return 0;
        }
        return super.getDataTypeMaxParameters(dataTypeName);
    }

    public String getSystemTableWhereClause(String tableNameColumn) {
    
    
        List<String> clauses = new ArrayList<String>(Arrays.asList("BIN$",
                "AQ$",
                "DR$",
                "SYS_IOT_OVER",
                "MLOG$_",
                "RUPD$_",
                "WM$_",
                "ISEQ$$_",
                "USLOG$",
                "SYS_FBA"));

        for (int i = 0;i<clauses.size(); i++) {
    
    
            clauses.set(i, tableNameColumn+" NOT LIKE '"+clauses.get(i)+"%'");
        }
        return "("+ StringUtil.join(clauses, " AND ") + ")";
    }

    @Override
    public boolean jdbcCallsCatalogsSchemas() {
    
    
        return true;
    }

    public Set<String> getUserDefinedTypes() {
    
    
        if (userDefinedTypes == null) {
    
    
            userDefinedTypes = new HashSet<>();
            if ((getConnection() != null) && !(getConnection() instanceof OfflineConnection)) {
    
    
                try {
    
    
                    try {
    
    
                        //noinspection HardCodedStringLiteral
                        userDefinedTypes.addAll(Scope.getCurrentScope().getSingleton(ExecutorService.class).getExecutor("jdbc", this).queryForList(new RawSqlStatement("SELECT DISTINCT TYPE_NAME FROM ALL_TYPES"), String.class));
                    } catch (DatabaseException e) {
    
     //fall back to USER_TYPES if the user cannot see ALL_TYPES
                        //noinspection HardCodedStringLiteral
                        userDefinedTypes.addAll(Scope.getCurrentScope().getSingleton(ExecutorService.class).getExecutor("jdbc", this).queryForList(new RawSqlStatement("SELECT TYPE_NAME FROM USER_TYPES"), String.class));
                    }
                } catch (DatabaseException e) {
    
    
                    //ignore error
                }
            }
        }

        return userDefinedTypes;
    }

    @Override
    public String generateDatabaseFunctionValue(DatabaseFunction databaseFunction) {
    
    
        //noinspection HardCodedStringLiteral
        if ((databaseFunction != null) && "current_timestamp".equalsIgnoreCase(databaseFunction.toString())) {
    
    
            return databaseFunction.toString();
        }
        if ((databaseFunction instanceof SequenceNextValueFunction) || (databaseFunction instanceof
                SequenceCurrentValueFunction)) {
    
    
            String quotedSeq = super.generateDatabaseFunctionValue(databaseFunction);
            // replace "myschema.my_seq".nextval with "myschema"."my_seq".nextval
            return quotedSeq.replaceFirst("\"([^\\.\"]+)\\.([^\\.\"]+)\"", "\"$1\".\"$2\"");

        }

        return super.generateDatabaseFunctionValue(databaseFunction);
    }

    @Override
    public ValidationErrors validate() {
    
    
        ValidationErrors errors = super.validate();
        DatabaseConnection connection = getConnection();
        if ((connection == null) || (connection instanceof OfflineConnection)) {
    
    
            //noinspection HardCodedStringLiteral
            Scope.getCurrentScope().getLog(getClass()).info("Cannot validate offline database");
            return errors;
        }

        if (!canAccessDbaRecycleBin()) {
    
    
            errors.addWarning(getDbaRecycleBinWarning());
        }

        return errors;

    }

    public String getDbaRecycleBinWarning() {
    
    
        //noinspection HardCodedStringLiteral,HardCodedStringLiteral,HardCodedStringLiteral,HardCodedStringLiteral,
        // HardCodedStringLiteral
        //noinspection HardCodedStringLiteral,HardCodedStringLiteral,HardCodedStringLiteral
        return "Liquibase needs to access the DBA_RECYCLEBIN table so we can automatically handle the case where " +
                "constraints are deleted and restored. Since Oracle doesn't properly restore the original table names " +
                "referenced in the constraint, we use the information from the DBA_RECYCLEBIN to automatically correct this" +
                " issue.\n" +
                "\n" +
                "The user you used to connect to the database (" + getConnection().getConnectionUserName() +
                ") needs to have \"SELECT ON SYS.DBA_RECYCLEBIN\" permissions set before we can perform this operation. " +
                "Please run the following SQL to set the appropriate permissions, and try running the command again.\n" +
                "\n" +
                "     GRANT SELECT ON SYS.DBA_RECYCLEBIN TO " + getConnection().getConnectionUserName() + ";";
    }

    public boolean canAccessDbaRecycleBin() {
    
    
        if (canAccessDbaRecycleBin == null) {
    
    
            DatabaseConnection connection = getConnection();
            if ((connection == null) || (connection instanceof OfflineConnection)) {
    
    
                return false;
            }

            Statement statement = null;
            try {
    
    
                statement = ((JdbcConnection) connection).createStatement();
                @SuppressWarnings("HardCodedStringLiteral") ResultSet resultSet = statement.executeQuery("select 1 from dba_recyclebin where 0=1");
                resultSet.close(); //don't need to do anything with the result set, just make sure statement ran.
                this.canAccessDbaRecycleBin = true;
            } catch (Exception e) {
    
    
                //noinspection HardCodedStringLiteral
                if ((e instanceof SQLException) && e.getMessage().startsWith("ORA-00942")) {
    
     //ORA-00942: table or view does not exist
                    this.canAccessDbaRecycleBin = false;
                } else {
    
    
                    //noinspection HardCodedStringLiteral
                    Scope.getCurrentScope().getLog(getClass()).warning("Cannot check dba_recyclebin access", e);
                    this.canAccessDbaRecycleBin = false;
                }
            } finally {
    
    
                JdbcUtils.close(null, statement);
            }
        }

        return canAccessDbaRecycleBin;
    }

    @Override
    public boolean supportsNotNullConstraintNames() {
    
    
        return true;
    }

    /**
     * Tests if the given String would be a valid identifier in Oracle DBMS. In Oracle, a valid identifier has
     * the following form (case-insensitive comparison):
     * 1st character: A-Z
     * 2..n characters: A-Z0-9$_#
     * The maximum length of an identifier differs by Oracle version and object type.
     */
    public boolean isValidOracleIdentifier(String identifier, Class<? extends DatabaseObject> type) {
    
    
        if ((identifier == null) || (identifier.length() < 1))
            return false;

        if (!identifier.matches("^(i?)[A-Z][A-Z0-9\\$\\_\\#]*$"))
            return false;

        /*
         * @todo It seems we currently do not have a class for tablespace identifiers, and all other classes
         * we do know seem to be supported as 12cR2 long identifiers, so:
         */
        return (identifier.length() <= LONG_IDENTIFIERS_LEGNTH);
    }

    /**
     * Returns the maximum number of bytes (NOT: characters) for an identifier. For Oracle <=12c Release 20, this
     * is 30 bytes, and starting from 12cR2, up to 128 (except for tablespaces, PDB names and some other rather rare
     * object types).
     *
     * @return the maximum length of an object identifier, in bytes
     */
    public int getIdentifierMaximumLength() {
    
    
        try {
    
    
            if (getDatabaseMajorVersion() < ORACLE_12C_MAJOR_VERSION) {
    
    
                return SHORT_IDENTIFIERS_LENGTH;
            } else if ((getDatabaseMajorVersion() == ORACLE_12C_MAJOR_VERSION) && (getDatabaseMinorVersion() <= 1)) {
    
    
                return SHORT_IDENTIFIERS_LENGTH;
            } else {
    
    
                return LONG_IDENTIFIERS_LEGNTH;
            }
        } catch (DatabaseException ex) {
    
    
            throw new UnexpectedLiquibaseException("Cannot determine the Oracle database version number", ex);
        }

    }
}

La ubicación del código fuente de OracleDatabase es la siguiente:
inserte la descripción de la imagen aquí

  1. Modifique liquibase.datatype.core.BooleanTypela clase para admitir la conversión entre el tipo de bit de Dameng y el tipo booleano de Java. Del mismo modo, javacree BooleanTypeuna clase en el archivo. La ruta completa de la clase es liquibase.datatype.core.BooleanTypey pegue el siguiente código en él.
//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by FernFlower decompiler)
//

package liquibase.datatype.core;

import java.util.Locale;
import liquibase.change.core.LoadDataChange.LOAD_DATA_TYPE;
import liquibase.database.Database;
import liquibase.database.core.DmDatabase;
import liquibase.database.core.*;
import liquibase.datatype.DataTypeInfo;
import liquibase.datatype.DatabaseDataType;
import liquibase.datatype.LiquibaseDataType;
import liquibase.exception.UnexpectedLiquibaseException;
import liquibase.statement.DatabaseFunction;
import liquibase.util.StringUtil;

@DataTypeInfo(
        name = "boolean",
        aliases = {
    
    "java.sql.Types.BOOLEAN", "java.lang.Boolean", "bit", "bool"},
        minParameters = 0,
        maxParameters = 0,
        priority = 1
)
public class BooleanType extends LiquibaseDataType {
    
    
    public BooleanType() {
    
    
    }

    public DatabaseDataType toDatabaseDataType(Database database) {
    
    
        String originalDefinition = StringUtil.trimToEmpty(getRawDefinition());
        if ((database instanceof Firebird3Database)) {
    
    
            return new DatabaseDataType("BOOLEAN");
        }

        if ((database instanceof AbstractDb2Database) || (database instanceof FirebirdDatabase)) {
    
    
            return new DatabaseDataType("SMALLINT");
        } else if (database instanceof MSSQLDatabase) {
    
    
            return new DatabaseDataType(database.escapeDataTypeName("bit"));
        } else if (database instanceof MySQLDatabase) {
    
    
            if (originalDefinition.toLowerCase(Locale.US).startsWith("bit")) {
    
    
                return new DatabaseDataType("BIT", getParameters());
            }
            return new DatabaseDataType("BIT", 1);
        } else if (database instanceof OracleDatabase) {
    
    
            return new DatabaseDataType("NUMBER", 1);
        } else if ((database instanceof SybaseASADatabase) || (database instanceof SybaseDatabase)) {
    
    
            return new DatabaseDataType("BIT");
        } else if (database instanceof DerbyDatabase) {
    
    
            if (((DerbyDatabase) database).supportsBooleanDataType()) {
    
    
                return new DatabaseDataType("BOOLEAN");
            } else {
    
    
                return new DatabaseDataType("SMALLINT");
            }
        } else if (database.getClass().isAssignableFrom(DB2Database.class)) {
    
    
            if (((DB2Database) database).supportsBooleanDataType())
                return new DatabaseDataType("BOOLEAN");
            else
                return new DatabaseDataType("SMALLINT");
        } else if (database instanceof HsqlDatabase) {
    
    
            return new DatabaseDataType("BOOLEAN");
        } else if (database instanceof PostgresDatabase) {
    
    
            if (originalDefinition.toLowerCase(Locale.US).startsWith("bit")) {
    
    
                return new DatabaseDataType("BIT", getParameters());
            }
        } else if(database instanceof DmDatabase) {
    
    
            return new DatabaseDataType("bit");
        }

        return super.toDatabaseDataType(database);
    }

    public String objectToSql(Object value, Database database) {
    
    
        if (value != null && !"null".equals(value.toString().toLowerCase(Locale.US))) {
    
    
            String returnValue;
            if (value instanceof String) {
    
    
                value = ((String)value).replaceAll("'", "");
                if (!"true".equals(((String)value).toLowerCase(Locale.US)) && !"1".equals(value) && !"b'1'".equals(((String)value).toLowerCase(Locale.US)) && !"t".equals(((String)value).toLowerCase(Locale.US)) && !((String)value).toLowerCase(Locale.US).equals(this.getTrueBooleanValue(database).toLowerCase(Locale.US))) {
    
    
                    if (!"false".equals(((String)value).toLowerCase(Locale.US)) && !"0".equals(value) && !"b'0'".equals(((String)value).toLowerCase(Locale.US)) && !"f".equals(((String)value).toLowerCase(Locale.US)) && !((String)value).toLowerCase(Locale.US).equals(this.getFalseBooleanValue(database).toLowerCase(Locale.US))) {
    
    
                        throw new UnexpectedLiquibaseException("Unknown boolean value: " + value);
                    }

                    returnValue = this.getFalseBooleanValue(database);
                } else {
    
    
                    returnValue = this.getTrueBooleanValue(database);
                }
            } else if (value instanceof Long) {
    
    
                if (Long.valueOf(1L).equals(value)) {
    
    
                    returnValue = this.getTrueBooleanValue(database);
                } else {
    
    
                    returnValue = this.getFalseBooleanValue(database);
                }
            } else if (value instanceof Number) {
    
    
                if (!value.equals(1) && !"1".equals(value.toString()) && !"1.0".equals(value.toString())) {
    
    
                    returnValue = this.getFalseBooleanValue(database);
                } else {
    
    
                    returnValue = this.getTrueBooleanValue(database);
                }
            } else {
    
    
                if (value instanceof DatabaseFunction) {
    
    
                    return value.toString();
                }

                if (!(value instanceof Boolean)) {
    
    
                    throw new UnexpectedLiquibaseException("Cannot convert type " + value.getClass() + " to a boolean value");
                }

                if ((Boolean)value) {
    
    
                    returnValue = this.getTrueBooleanValue(database);
                } else {
    
    
                    returnValue = this.getFalseBooleanValue(database);
                }
            }

            return returnValue;
        } else {
    
    
            return null;
        }
    }

    protected boolean isNumericBoolean(Database database) {
    
    
        if (database instanceof DerbyDatabase) {
    
    
            return !((DerbyDatabase) database).supportsBooleanDataType();
        } else if (database.getClass().isAssignableFrom(DB2Database.class)) {
    
    
            return !((DB2Database) database).supportsBooleanDataType();
        }
        return (database instanceof Db2zDatabase) || (database instanceof DB2Database) || (database instanceof FirebirdDatabase) || (database instanceof
                MSSQLDatabase) || (database instanceof MySQLDatabase) || (database instanceof OracleDatabase) ||
                (database instanceof SQLiteDatabase) || (database instanceof SybaseASADatabase) || (database instanceof
                SybaseDatabase) || (database instanceof DmDatabase);
    }

    public String getFalseBooleanValue(Database database) {
    
    
        if (this.isNumericBoolean(database)) {
    
    
            return "0";
        } else {
    
    
            return database instanceof InformixDatabase ? "'f'" : "FALSE";
        }
    }

    public String getTrueBooleanValue(Database database) {
    
    
        if (this.isNumericBoolean(database)) {
    
    
            return "1";
        } else {
    
    
            return database instanceof InformixDatabase ? "'t'" : "TRUE";
        }
    }

    public LOAD_DATA_TYPE getLoadTypeName() {
    
    
        return LOAD_DATA_TYPE.BOOLEAN;
    }
}
  1. Modifique resources/META-INF.services/liquibase.database.Databaseel contenido, agregue compatibilidad con DmDatabase , cree de manera similar los archivos correspondientes en el directorio liquibase.database.core.DmDatabasede su propio proyecto y pegue el contenido correspondiente.resources
liquibase.database.core.CockroachDatabase
liquibase.database.core.DB2Database
liquibase.database.core.Db2zDatabase
liquibase.database.core.DerbyDatabase
liquibase.database.core.Firebird3Database
liquibase.database.core.FirebirdDatabase
liquibase.database.core.H2Database
liquibase.database.core.HsqlDatabase
liquibase.database.core.InformixDatabase
liquibase.database.core.Ingres9Database
liquibase.database.core.MSSQLDatabase
liquibase.database.core.MariaDBDatabase
liquibase.database.core.MockDatabase
liquibase.database.core.MySQLDatabase
liquibase.database.core.OracleDatabase
liquibase.database.core.PostgresDatabase
liquibase.database.core.SQLiteDatabase
liquibase.database.core.SybaseASADatabase
liquibase.database.core.SybaseDatabase
liquibase.database.core.DmDatabase
liquibase.database.core.UnsupportedDatabase

La estructura del proyecto modificado es la siguiente, y el cuadro rojo es un elemento nuevo:
inserte la descripción de la imagen aquí

Resumir

Al usar flowable para integrar Dream 8, si no hay un requisito para que el proyecto de inicio genere tablas relacionadas con flowable, se recomienda usar el siguiente esquema:

  1. Use DM数据迁移工具la tabla de migración y los datos, el método de operación específico se puede encontrar en mi blog anterior: Tutorial de migración de datos a la base de datos DM8 .
  2. Una vez completada la migración, sqlel script se puede exportar y ejecutar para crear flowabletablas relacionadas.

Si existe un requisito para la generación automática de tablas y no hay una solución con este método de blog, puede consultar la siguiente solución:

  1. Rebajar Flwoablela versión.
  2. FlowableExcluir las dependencias que provocan errores de generación de tablas en las dependencias, si no se utiliza la función de la tabla correspondiente se puede excluir .
  3. Si no se pueden descartar las dependencias correspondientes, puede consultar 修改Flowable源码el segundo paso de este blog para solucionar el problema.

Supongo que te gusta

Origin blog.csdn.net/TangBoBoa/article/details/130392495
Recomendado
Clasificación