JOOQ 3.11引入了一个名为implicit joins的强大功能。
不幸的是,新功能会导致我们半生不熟的应用程序模块化出现问题。
症状
查看JOOQ generator source code,我发现只有当JOOQ生成器找到引用{的外键时,才会生成以下生成的类FileStorage
(一个Table
子类)的构造函数。 {1}}:
FILE_STORAGE
这导致我们的构建中的编译错误,它分别为每个应用程序模块生成JOOQ模型:
我们使用每个应用程序模块一个模式(例如public <O extends Record> FileStorage(Table<O> child, ForeignKey<O, FileStorageRecord> key) {
super(child, key, FILE_STORAGE);
}
)和一个从每个应用程序模块可见的特殊模式billing
。 shared
的JOOQ元模型与其他元素完全隔离生成,因此在shared
的代码生成期间,从shared
(模块INVOICE
)到{的外键{1}}(模块billing
)将不会对JOOQ生成器可见。因此,上面的构造函数在FILE_STORAGE
方面缺失,但在JOOQ模型的shared
方面没有,我们最终在FILE_STORAGE
来自INVOICE
&#的编译错误39; s JOOQ模型。
问题
在10多个应用程序模块中没有复制Invoice
的JOOQ模型,是否有解决此问题的方法?为什么这些构造函数无条件生成?
答案 0 :(得分:1)
当前实现(jOOQ 3.10.0)的原因是为了防止在大型模式中只有很少外键约束的情况下生成“过多”代码。即有这个限制只有很少的收获。
在您的设置中生成的代码中存在编译错误这一事实暗示这种限制实际上是错误的。它应该从jOOQ 3.12.0和3.11.1再次删除:
https://github.com/jOOQ/jOOQ/issues/7573
解决方法可能是使用后处理器生成所有架构并删除不需要的代码。