首页 > 解决方案 > 尽管配置,JOOQ 不会忽略未知功能

问题描述

由于框架未知的功能,我的 jOOQ 代码生成配置失败。配置使用org.jooq.meta.extensions.ddl.DDLDatabase,旨在从 Flyway 迁移脚本生成代码。错误如下:

Error running jOOQ code generation tool: Error while exporting schema: SQL [create table CUSTOMER (ID uuid not null default UUID_GENERATE_V4(), NAME varchar(255) not null, primary key (ID))]; Function "UUID_GENERATE_V4" not found;

通过检查文档,我看到有一个parseUnknownFunctions解析器属性,据我所知,当设置为IGNORE. 这似乎没有任何效果。

我也知道有一种解决方法可以让 jOOQ 通过添加注释来忽略 SQL 文件的某些部分。在我的情况下这是不可能的,因为我不是 SQL 文件的所有者。

我还有其他选择吗?

以下是导致错误的脚本和 pom.xml 中的 jOOQ 配置:

create table customer (
    id   uuid         not null default uuid_generate_v4(),
    name varchar(255) not null,
    primary key (id)
);
<plugin>
  <groupId>org.jooq</groupId>
  <artifactId>jooq-codegen-maven</artifactId>
  <executions>
    <execution>
      <id>generate-jooq-sources</id>
      <phase>generate-sources</phase>
      <goals>
        <goal>generate</goal>
      </goals>
      <configuration>
        <generator>
          <database>
            <name>org.jooq.meta.extensions.ddl.DDLDatabase</name>
            <inputSchema>PUBLIC</inputSchema>
            <outputSchemaToDefault>true</outputSchemaToDefault>
            <outputCatalogToDefault>true</outputCatalogToDefault>
            <properties>
              <property>
                <key>sort</key>
                <value>semantic</value>
              </property>
              <property>
                <key>scripts</key>
                <value>src/main/resources/db/migration/*</value>
              </property>
              <property>
                <key>parseUnknownFunctions</key>
                <value>IGNORE</value>
              </property>
            </properties>
          </database>
          <target>
            <clean>true</clean>
            <packageName>com.product</packageName>
            <directory>${project.generated-sources}/jooq/src/main/java</directory>
          </target>
        </generator>
      </configuration>
    </execution>
  </executions>
  <dependencies>
    <dependency>
      <groupId>org.jooq</groupId>
      <artifactId>jooq-meta-extensions</artifactId>
      <version>${jooq.version}</version>
    </dependency>
  </dependencies>
</plugin>

标签: jooqjooq-codegen-maven

解决方案


如果您查看完整的堆栈跟踪,您会发现错误不是由 jOOQ 引发的,而是由 H2 引发的:

Caused by: org.h2.jdbc.JdbcSQLSyntaxErrorException: Function "UUID_GENERATE_V4" not found; SQL statement:
create table CUSTOMER (ID uuid not null default UUID_GENERATE_V4(), NAME varchar(255) not null, primary key (ID)) [90022-200]
    at org.h2.message.DbException.getJdbcSQLException (DbException.java:576)
    at org.h2.message.DbException.getJdbcSQLException (DbException.java:429)
    at org.h2.message.DbException.get (DbException.java:205)
    at org.h2.message.DbException.get (DbException.java:181)
    at org.h2.command.Parser.readJavaFunction (Parser.java:3565)
    at org.h2.command.Parser.readFunction (Parser.java:3770)
    at org.h2.command.Parser.readTerm (Parser.java:4305)
    at org.h2.command.Parser.readFactor (Parser.java:3343)
    at org.h2.command.Parser.readSum (Parser.java:3330)
    at org.h2.command.Parser.readConcat (Parser.java:3305)
    at org.h2.command.Parser.readCondition (Parser.java:3108)
    at org.h2.command.Parser.readExpression (Parser.java:3059)
    at org.h2.command.Parser.parseColumnForTable (Parser.java:5727)
    at org.h2.command.Parser.parseTableColumnDefinition (Parser.java:8442)
    at org.h2.command.Parser.parseCreateTable (Parser.java:8379)
    at org.h2.command.Parser.parseCreate (Parser.java:6276)
    at org.h2.command.Parser.parsePrepared (Parser.java:903)
    at org.h2.command.Parser.parse (Parser.java:843)
    at org.h2.command.Parser.parse (Parser.java:815)
    at org.h2.command.Parser.prepareCommand (Parser.java:738)
    at org.h2.engine.Session.prepareLocal (Session.java:657)
    at org.h2.engine.Session.prepareCommand (Session.java:595)
    at org.h2.jdbc.JdbcConnection.prepareCommand (JdbcConnection.java:1235)
    at org.h2.jdbc.JdbcStatement.executeInternal (JdbcStatement.java:212)
    at org.h2.jdbc.JdbcStatement.execute (JdbcStatement.java:201)
    at org.jooq.tools.jdbc.DefaultStatement.execute (DefaultStatement.java:102)
    at org.jooq.impl.SettingsEnabledPreparedStatement.execute (SettingsEnabledPreparedStatement.java:227)
    at org.jooq.impl.AbstractQuery.execute (AbstractQuery.java:411)
    at org.jooq.impl.AbstractQuery.execute (AbstractQuery.java:332)
    at org.jooq.meta.extensions.ddl.DDLDatabase.load (DDLDatabase.java:183)
    at org.jooq.meta.extensions.ddl.DDLDatabase.lambda$0 (DDLDatabase.java:156)

当前(jOOQ 3.15)实现DDLDatabase将您的 DDL 转换为 H2 方言,并在内存数据库中的 H2 中运行它以模拟您的 DDL。H2 不支持此功能。未来的 jOOQ 版本将在不使用 H2 的情况下解释 DDL(请参阅https://github.com/jOOQ/jOOQ/issues/7034),但目前情况并非如此。

作为一种解决方法,您可以使用此处记录的 jOOQ 解析器忽略注释语法: https ://www.jooq.org/doc/latest/manual/code-generation/codegen-ddl/

具体来说:

create table customer (
    id   uuid         not null 
    /* [jooq ignore start] */ default uuid_generate_v4() /* [jooq ignore stop] */,
    name varchar(255) not null,
    primary key (id)
);

或者(更好!)使用此处记录的基于测试容器的方法之一:https ://github.com/jOOQ/jOOQ/issues/6551或在此示例中:https ://github.com/jOOQ/jOOQ/tree/主/jOOQ-examples/jOOQ-testcontainers-example


推荐阅读