是否可以在 jOOQ 中设置自定义类型,不仅基于列名或数据类型,还基于 table 名称?
Is it possible to set a custom type in jOOQ not only based on the column name or data type, but on the table name?
我有一个项目在数据库中的 ID 类似于 FOO_ID
(对于 table FOO
)。我发现在 Java 中定义一个名为 FooId
的小 class 包装实际值很方便,并将 FOO_ID
列的类型映射到 [=30 中的 FooId
=].这样可以进行更好的类型检查,因为我不会不小心将 "foo id" 写入 "bar id" 列而编译器不会给我一个错误。
在新项目中,所有 ID 列在每个 table 中简称为 ID
。我无法更改数据库架构,唉,这是我无法控制的。我希望 <forcedType>
能够匹配 "column named 'ID' in table named 'FOO'",但现在我不知道该怎么做,我认为这是不可能的。
除了列名之外,是否可以根据 table 名称来约束 <forcedType>
?如果是这样,语法是什么?
提前致谢!
现有功能请求
这个想法已经在 jOOQ mailing list a couple of times and there's also a pending feature request that will add support for a special generated key type: #6124 上讨论过。
除了您建议的以外,外键类型还应与其引用的主键类型相匹配。这些类型的挑战在于使其适用于所有边缘情况,包括:
- 复合键
- 唯一键(在很多数据库中也可以被外键引用)
- 参与多个唯一键/外键的列
虽然这当然是一个有趣的功能,但它在 jOOQ 3.9 中尚不可用。
解决方法
您可以通过以下方式自行解决此限制:
- 扩展
JavaGenerator
以便为每个主键/外键生成您自己的类型
- 使用
<forcedType/>
将所有单列键类型替换为您自己生成的类型
最好使用编程代码生成配置来完成此操作 - 否则您需要输入很多 XML(当然,您也可以使用 XSLT 来生成配置)。
我有一个项目在数据库中的 ID 类似于 FOO_ID
(对于 table FOO
)。我发现在 Java 中定义一个名为 FooId
的小 class 包装实际值很方便,并将 FOO_ID
列的类型映射到 [=30 中的 FooId
=].这样可以进行更好的类型检查,因为我不会不小心将 "foo id" 写入 "bar id" 列而编译器不会给我一个错误。
在新项目中,所有 ID 列在每个 table 中简称为 ID
。我无法更改数据库架构,唉,这是我无法控制的。我希望 <forcedType>
能够匹配 "column named 'ID' in table named 'FOO'",但现在我不知道该怎么做,我认为这是不可能的。
除了列名之外,是否可以根据 table 名称来约束 <forcedType>
?如果是这样,语法是什么?
提前致谢!
现有功能请求
这个想法已经在 jOOQ mailing list a couple of times and there's also a pending feature request that will add support for a special generated key type: #6124 上讨论过。
除了您建议的以外,外键类型还应与其引用的主键类型相匹配。这些类型的挑战在于使其适用于所有边缘情况,包括:
- 复合键
- 唯一键(在很多数据库中也可以被外键引用)
- 参与多个唯一键/外键的列
虽然这当然是一个有趣的功能,但它在 jOOQ 3.9 中尚不可用。
解决方法
您可以通过以下方式自行解决此限制:
- 扩展
JavaGenerator
以便为每个主键/外键生成您自己的类型 - 使用
<forcedType/>
将所有单列键类型替换为您自己生成的类型
最好使用编程代码生成配置来完成此操作 - 否则您需要输入很多 XML(当然,您也可以使用 XSLT 来生成配置)。