jOOQ 使用一个数据库生成代码,另一个数据库执行代码

我们正在更改数据库,从支持 8 位 int 的数据库更改为不支持的数据库。当 Liquibase 创建一个导致 jOOQ 生成“短”变量但我们的代码使用 byte/Byte 的 DB 时,我们的代码会中断——这会破坏代码签名。

有人建议我们继续使用以前的数据库 (HSQLDB) 生成代码,而不是重新编码,它“应该”与新数据库一起运行。有不同意见,除了直觉我找不到任何确定的东西,这似乎与 jOOQ 的设计目的背道而驰。有没有人成功地做到了这一点?


皈依舞
浏览 192回答 1
1回答

牧羊人nacy

对于这样的问题显然没有绝对的是/否答案,但是有几种解决方案/解决方法:使用之前的数据库产品生成代码这将在短时间内起作用,例如现在,但随着您继续前进,它将成为您的模式设计的一个极其有限的因素。您将继续围绕 HSQLDB 的功能定制您的 DDL 和其他一些设计决策,并且您将无法利用新数据库产品的其他功能。这在迁移数据时尤其受限,因为ALTER TABLE方言之间的陈述大不相同。我只会在很短的时间内推荐这种方法,例如,如果您不能立即彻底解决这个问题。使用 jOOQ 的<forcedType/>机制来重写你的数据类型jOOQ 的代码生成器允许在将模式的元数据加载到代码生成器之前重写数据类型。这样,即使您的新数据库产品不byte支持.TINYINTTINYINT这是一个彻底的解决方案,无论您使用的是什么产品,您都可能希望实施它,因为它会为您提供一种方法来重新定义部分架构,仅适用于 jOOQ 的代码生成器,而与您生成代码的方式无关.该功能记录在此处: https: //www.jooq.org/doc/latest/manual/code-generation/codegen-advanced/codegen-config-database/codegen-database-forced-types对于您的情况,这绝对是一个更长期的解决方案。请注意,未来的 jOOQ 将能够使用CHECK约束作为输入元数据来决定是否应用这样的<forcedType/>. 我想你会CHECK (my_smallint BETWEEN -128 AND 127)在每个这样的列上放置一个约束,所以你可以很容易地识别哪些列适用于<forcedType/>:https://github.com/jOOQ/jOOQ/issues/8843在该功能可用之前,您可以通过编程代码生成器配置自己实现它: https: //www.jooq.org/doc/latest/manual/code-generation/codegen-programmatic/或者,从 jOOQ 3.12 开始,通过使用 SQL 表达式来生成匹配的正则表达式<forcedType/>。例如在 Oracle 中:<forcedType>&nbsp; <name>TINYINT</name>&nbsp; <sql>&nbsp; &nbsp; select listagg(owner || '.' || table_name || '.'&nbsp;&nbsp; &nbsp; &nbsp; || regexp_replace(search_condition_vc, ' between.*', ''), '|')&nbsp; &nbsp; from user_constraints&nbsp; &nbsp; where constraint_type = 'C'&nbsp; &nbsp; and regexp_like(search_condition_vc, '.* between -128 and 127');&nbsp; </sql></forcedType>您可以使用基于文件的元数据源jOOQ 不必连接到实时数据库实例即可对您的模式进行逆向工程。您还可以将 DDL 代码传递给 jOOQ 或 XML 文件:https://www.jooq.org/doc/latest/manual/code-generation/codegen-ddl/https://www.jooq.org/doc/latest/manual/code-generation/codegen-xml/这并不能真正直接解决您的问题,但也许可以使解决起来更容易一些。但是,这些方法还有其他限制,例如,当前(jOOQ 3.12)不支持存储过程,所以我只是为了完整起见在这里添加它,而不是建议您现在使用它。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java