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

时间:2019-06-27 21:47:48

标签: java sql jooq

我们正在将数据库从支持8位int的数据库更改为不支持int的数据库。当Liquibase创建导致jOOQ生成“短”变量的数据库时,我们的代码中断,但是我们的代码使用字节/字节-这破坏了代码签名。

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

1 个答案:

答案 0 :(得分:1)

对于这个问题,显然没有绝对的是/否答案,但是有几种解决方案/解决方法:

使用以前的数据库产品来生成代码

这将在短时间内起作用,例如现在,但是随着您的前进,这将是架构设计的一个极端限制因素。您将继续围绕HSQLDB的功能来定制DDL和其他一些设计决策,并且您将无法利用新数据库产品的其他功能。在迁移数据时,这尤其可能会受到限制,因为方言之间的ALTER TABLE语句完全不同。

我只建议在很短的时间内使用此方法,例如如果您不能立即彻底解决此问题。

使用jOOQ的<forcedType/>机制来重写数据类型

jOOQ的代码生成器允许在将架构的元数据加载到代码生成器之前重写数据类型。这样,即使新的数据库产品不支持byte,您也可以假装TINYINT类型为TINYINT

这是一个全面的解决方案,无论您使用什么产品,都可能要实施,因为它为您提供了一种只为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>
  <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),因此为了完整性起见,我只是在这里添加它,而不是建议您立即使用它。