我们正在将数据库从支持8位int的数据库更改为不支持int的数据库。当Liquibase创建导致jOOQ生成“短”变量的数据库时,我们的代码中断,但是我们的代码使用字节/字节-这破坏了代码签名。
有人建议不要继续编码,而是建议我们继续使用以前的数据库(HSQLDB)生成代码,并且该代码“应该”与新数据库一起运行。有不同意见,我无法凭直觉找到任何确定的东西,这似乎与jOOQ的设计宗旨背道而驰。有人成功做到了吗?
答案 0 :(得分:1)
对于这个问题,显然没有绝对的是/否答案,但是有几种解决方案/解决方法:
这将在短时间内起作用,例如现在,但是随着您的前进,这将是架构设计的一个极端限制因素。您将继续围绕HSQLDB的功能来定制DDL和其他一些设计决策,并且您将无法利用新数据库产品的其他功能。在迁移数据时,这尤其可能会受到限制,因为方言之间的ALTER TABLE
语句完全不同。
我只建议在很短的时间内使用此方法,例如如果您不能立即彻底解决此问题。
<forcedType/>
机制来重写数据类型byte
,您也可以假装TINYINT
类型为TINYINT
。
这是一个全面的解决方案,无论您使用什么产品,都可能要实施,因为它为您提供了一种只为jOOQ的代码生成器重新定义模式部分的方法,而与您的使用方式无关生成代码。
这绝对是针对您的情况的长期解决方案。
注意,将来的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>
<name>TINYINT</name>
<sql>
select listagg(owner || '.' || table_name || '.'
|| regexp_replace(search_condition_vc, ' between.*', ''), '|')
from user_constraints
where constraint_type = 'C'
and regexp_like(search_condition_vc, '.* between -128 and 127');
</sql>
</forcedType>
jOOQ不必连接到实时数据库实例即可对架构进行反向工程。您还可以将DDL代码传递到jOOQ或XML文件:
这并不能真正直接解决您的问题,但是也许可以使解决起来容易一些。但是,这些方法还有其他局限性,例如存储过程当前不支持(jOOQ 3.12),因此为了完整性起见,我只是在这里添加它,而不是建议您立即使用它。