【问题标题】:Why does Jooq code-generation break with PostGIS?为什么 Jooq 代码生成会与 PostGIS 发生冲突?
【发布时间】:2019-09-20 06:28:37
【问题描述】:

上下文 - 我正在尝试 Postgres 的地理信息系统扩展 PostGis,它可以将故事的纬度和经度设为 Point 并对其进行操作。

If I understand correctly 那么我需要添加一个自定义转换器,可以在 JOOQ 和 PostGis 之间转换 point 并将其添加到 gradle 文件中。

问题 - 当我生成 jooq 代码时,很少有文件生成不正确,并且字段定义了两次,导致编译失败。它们是:

<configured-generation-dir>/tables/StValuecount.java
<configured-generation-dir>/tables/records/StValuecountRecord.java
<configured-generation-dir>/tables/records/StValuepercentRecord.java
<configured-generation-dir>/tables/_StValuecount.java
<configured-generation-dir>/tables/records/_StValuecountRecord.java
<configured-generation-dir>/tables/_StHistogram.java
<configured-generation-dir>/tables/records/_StHistogramRecord.java
<configured-generation-dir>/tables/_StQuantile.java

Gradle 配置 =>

jooq{
    myAwesomeApp(sourceSets.main){
        logging = 'WARN'
        jdbc {
            driver = 'org.postgresql.Driver'
            url = db_url
            user = db_user
            password = db_password
        }
        generator {
            name = 'org.jooq.codegen.DefaultGenerator'
            strategy {
                name = 'org.jooq.codegen.DefaultGeneratorStrategy'
            }
            database {
                name = 'org.jooq.meta.postgres.PostgresDatabase'
                inputSchema = 'public'
                forcedTypes {
                    forcedType {
                        userType = 'org.postgis.Point'
                        converter = 'com.example.JooqBreaksWithPostGis.jooq.converters.PostgresPointJooqConverter'
                        expression = '.*\\.point'
                        types = '.*'
                    }
                }
            }
            generate {
                routines = false
                relations = true
                deprecated = false
                records = true
                immutablePojos = false
                fluentSetters = true
            }
            target {
                packageName = 'jooq.fancy.app'
                directory = 'src/main/java/generated'
            }
        }
    }
}

我做错了什么?


我还创建了一个最小的project,我在其中重现了问题,以防有人想快速尝试。

重现步骤

  • 结帐项目
git clone git@github.com:raj-saxena/JooqBreaksWithPostGis.git
  • 进入项目目录,启动 postgis docker 容器
docker-compose up
  • 同样,要删除 postgis docker 容器运行
docker-compose down 
  • 运行添加一个简单的City 表的迁移,该表包含Point 类型和
./gradlew flywayMigrate
  • 我在第二次迁移中添加了几行,以验证数据库结构是否正常工作。在 build.gradle 文件中连接到 Postgres 实例的详细信息。

  • 使用

  • 生成 jooq 文件
./gradlew generateMyAwesomeAppJooqSchemaSource
  • 验证文件是在配置的src/main/java/generated目录下生成的。

  • 验证上述文件是否编译失败。


以 Lukas 的advice,我将排除配置添加到 jooq 配置中,如下所示:

            database {
                name = 'org.jooq.meta.postgres.PostgresDatabase'
                ...
                excludes = '.*ST_ValueCount' +
                        '|.*St_Valuepercent' +
                        '|.*St_Histogram' +
                        '|.*St_Quantile' +
                        '|.*St_Approxhistogram' +
                        '|.*St_PixelOfValue' +
                        '|.*St_Approxquantile' +
                        '|.*ST_Tile'
            }

这允许代码编译。

【问题讨论】:

  • 那些(例如st_valuecount)是重载的表值函数吗?
  • 作为记录,这也被报告为github.com/jOOQ/jOOQ/issues/8587上的一个错误
  • 您能解释一下database 部分的位置吗?我假设你把它放在你的 build.gradle 文件中。你能解释一下你把它放在文件的哪里吗? Gradle 对隐式配置方式的广泛使用让那些没有花费无数时间学习其复杂细节的人难以理解。

标签: postgresql build.gradle postgis jooq


【解决方案1】:

这听起来很像https://github.com/jOOQ/jOOQ/issues/4055。 jOOQ 3.11 目前无法在任何支持表值函数的 RDBMS 中处理重载的表值函数。您最好的选择是从代码生成中排除所有受影响的函数,使用&lt;excludes&gt;

https://www.jooq.org/doc/latest/manual/code-generation/codegen-advanced/codegen-config-database/codegen-database-includes-excludes/

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-04-07
    • 1970-01-01
    • 2021-01-09
    • 2021-08-28
    • 2014-12-16
    • 2014-09-09
    • 2017-12-03
    • 2017-08-13
    相关资源
    最近更新 更多