如何始终为 JOOQ 3.11 的隐式连接功能生成“Table”构造函数?
How to always generate `Table` constructors for JOOQ 3.11's implicit-join feature?
JOOQ 3.11 引入了一个很棒的功能,叫做 implicit joins。
不幸的是,新功能给我们不成熟的应用程序模块化带来了麻烦。
症状
查看JOOQ generator source code,发现下面生成的classFileStorage
构造函数(一个Table
子class)仅当 JOOQ 生成器找到引用 FILE_STORAGE
:
的外键时
public <O extends Record> FileStorage(Table<O> child, ForeignKey<O, FileStorageRecord> key) {
super(child, key, FILE_STORAGE);
}
这会导致我们的构建中出现编译错误,分别为每个应用程序模块生成 JOOQ 模型:
我们对每个应用程序模块使用一种模式(例如 billing
),并使用一种从每个应用程序模块可见的特殊模式 shared
。 shared
的 JOOQ 元模型是在与其余部分完全隔离的情况下生成的,因此在 shared
的代码生成期间,从 INVOICE
(模块 billing
)到 FILE_STORAGE
(模块shared
)对 JOOQ 生成器不可见。因此,上述构造函数在 JOOQ 模型的 FILE_STORAGE
端缺失,但在 INVOICE
端不存在,我们最终在 billing
的 Invoice
中出现编译错误JOOQ模型.
问题
在 10+ 个应用程序模块中无法复制 shared
的 JOOQ 模型,是否有解决此问题的方法?为什么这些构造函数不是无条件生成的?
当前实施 (jOOQ 3.10.0) 的原因是为了防止 "excessive" 在大型模式中只有很少的外键约束的情况下生成代码。 IE。有这个限制只有一点好处。
在您的设置中生成的代码中存在编译错误这一事实表明此限制实际上是错误的。它应该再次从 jOOQ 3.12.0 和 3.11.1 中删除:
https://github.com/jOOQ/jOOQ/issues/7573
解决方法是生成所有模式并使用 post 处理器删除不需要的代码。
JOOQ 3.11 引入了一个很棒的功能,叫做 implicit joins。
不幸的是,新功能给我们不成熟的应用程序模块化带来了麻烦。
症状
查看JOOQ generator source code,发现下面生成的classFileStorage
构造函数(一个Table
子class)仅当 JOOQ 生成器找到引用 FILE_STORAGE
:
public <O extends Record> FileStorage(Table<O> child, ForeignKey<O, FileStorageRecord> key) {
super(child, key, FILE_STORAGE);
}
这会导致我们的构建中出现编译错误,分别为每个应用程序模块生成 JOOQ 模型:
我们对每个应用程序模块使用一种模式(例如 billing
),并使用一种从每个应用程序模块可见的特殊模式 shared
。 shared
的 JOOQ 元模型是在与其余部分完全隔离的情况下生成的,因此在 shared
的代码生成期间,从 INVOICE
(模块 billing
)到 FILE_STORAGE
(模块shared
)对 JOOQ 生成器不可见。因此,上述构造函数在 JOOQ 模型的 FILE_STORAGE
端缺失,但在 INVOICE
端不存在,我们最终在 billing
的 Invoice
中出现编译错误JOOQ模型.
问题
在 10+ 个应用程序模块中无法复制 shared
的 JOOQ 模型,是否有解决此问题的方法?为什么这些构造函数不是无条件生成的?
当前实施 (jOOQ 3.10.0) 的原因是为了防止 "excessive" 在大型模式中只有很少的外键约束的情况下生成代码。 IE。有这个限制只有一点好处。
在您的设置中生成的代码中存在编译错误这一事实表明此限制实际上是错误的。它应该再次从 jOOQ 3.12.0 和 3.11.1 中删除:
https://github.com/jOOQ/jOOQ/issues/7573
解决方法是生成所有模式并使用 post 处理器删除不需要的代码。