JOOQ CodeGen:不为Oracle同义词生成Java代码

问题描述 投票:0回答:1

设置:

  • JOOQ 3.13.1 Professional
  • dialect ORACLE12C

我们有2个同义词指向不同的表。

同义词:TAB_CONFIGURATION指向表格(TAB _.._ 01 ... TAB _.._ 08)TAB_CONFIGURATION_NEXT指向表格(TAB _.._ 01 ... TAB _.._ 08)

表格:TAB_CONFIGURATION_01..TAB_CONFIGURATION_08

JOOQ代码生成器不会为2个同义词生成任何Java类(仅针对8个表)。我不知道为什么不这样做。

JOOQ代码生成器可以完全处理Oracle同义词吗?

jooq
1个回答
0
投票

从jOOQ 3.13开始,尚不以此方式支持同义词

这确实是一个有用的功能,但是,从3.13:https://github.com/jOOQ/jOOQ/issues/1563开始,它尚未在jOOQ中实现。

Oracle不会通过SYS.ALL_TABLESSYS.ALL_TAB_COLS之类的字典视图将同义词报告为普通表,因此,发现普通表之类的同义词并不容易,包括:

  • 表信息
  • 列信息
  • 约束信息

所有这些信息都需要通过递归遍历SYS.ALL_SYNONYMS中公开的图形来发现。

但是,从jOOQ 3.13开始,当过程/程序包通过同义词引用数据类型时,会自省SYS.ALL_SYNONYMS,在这种情况下,将同义词解析为实际数据类型。

解决方法:视图

您可以使用视图代替同义词。对于大多数用例,别名表的工作方式完全相同。

所以,如果您有:

CREATE TABLE tab_configuration_01 (...);
CREATE TABLE tab_configuration_02 (...);
...
CREATE TABLE tab_configuration_08 (...);

而不是定义:

CREATE SYNONYM tab_configuration FOR tab_configuration_02;
CREATE SYNONYM tab_configuration_next FOR tab_configuration_03;

您也可以定义:

CREATE VIEW view_configuration AS SELECT * FROM tab_configuration_02;
CREATE VIEW view_configuration_next AS SELECT * FROM tab_configuration_03;

这在jOOQ中已经可以使用。优点:您可以访问带有数字后缀的实际表(如果需要)或视图。您可以在数据库中更新视图定义,而无需更改客户端代码,即无需重新生成它(假设所有表都相同)。

解决方法:jOOQ的生成器策略

您可以使用“生成器策略”来定义生成的类名称和标识符名称:

例如:

<generator>
  <strategy>
    <matchers>
      <tables>
        <table>
          <expression>TAB_CONFIGURATION_02</expression>
          <tableClass>
            <transform>PASCAL</transform>
            <expression>TAB_CONFIGURATION</expression>
          </tableClass>
          <tableIdentifier>
            <transform>AS_IS</transform>
            <expression>TAB_CONFIGURATION</expression>
          </tableIdentifier>
        </table>
        <table>
          <expression>TAB_CONFIGURATION_03</expression>
          <tableClass>
            <transform>PASCAL</transform>
            <expression>TAB_CONFIGURATION_NEXT</expression>
          </tableClass>
          <tableIdentifier>
            <transform>AS_IS</transform>
            <expression>TAB_CONFIGURATION_NEXT</expression>
          </tableIdentifier>
        </table>
      </tables>
    </matchers>
  </strategy>
</generator>

优点:您不需要为“同义词”使用新的数据库对象。但是您不能再从客户端代码中引用原始的带数字后缀的表,因为它们可能会重命名为其他名称。另外,每次要更改“同义词”时,都必须重新生成jOOQ代码。

© www.soinside.com 2019 - 2024. All rights reserved.