【问题标题】:JOOQ CodeGen: does not generate Java code for Oracle SynonymsJOOQ CodeGen:不为 Oracle Synonyms 生成 Java 代码
【发布时间】:2020-08-12 05:40:12
【问题描述】:

设置:

  • 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】:

    从 jOOQ 3.13 开始,不支持同义词

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

    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 代码。

    【讨论】:

      猜你喜欢
      • 2021-12-29
      • 1970-01-01
      • 2012-07-13
      • 2021-10-28
      • 2014-09-09
      • 2017-12-03
      • 2017-08-13
      • 2020-01-23
      • 2019-12-21
      相关资源
      最近更新 更多