首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JOOQ CodeGen:不为Oracle同义词生成Java代码

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

Stack Overflow用户
提问于 2020-04-28 12:00:14
回答 1查看 300关注 0票数 0

设置:

  • JOOQ 3.13.1 Professional
  • dialect ORACLE12C

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

同义词:

TAB_CONFIGURATION指向一个表(TAB_.._01 .TAB_.._08)

TAB_CONFIGURATION_NEXT指向一个表(TAB_.._01 .TAB_.._08)

表:

TAB_CONFIGURATION_01

。。

TAB_CONFIGURATION_08

JOOQ代码生成器不为这两个同义词生成任何Java类(仅用于8个表)。我不知道为什么不。

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

EN

回答 1

Stack Overflow用户

发布于 2020-05-01 08:04:14

同义词还不支持这种方式,如jOOQ 3.13

这将是一个有用的特性,实际上,它还没有在jOOQ中实现,只有3.13:https://github.com/jOOQ/jOOQ/issues/1563

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

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

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

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

解决办法:视图

您可以使用视图而不是同义词。对于大多数用例,这与别名表的工作方式完全一样。

所以,如果你有

代码语言:javascript
复制
CREATE TABLE tab_configuration_01 (...);
CREATE TABLE tab_configuration_02 (...);
...
CREATE TABLE tab_configuration_08 (...);

而不是定义:

代码语言:javascript
复制
CREATE SYNONYM tab_configuration FOR tab_configuration_02;
CREATE SYNONYM tab_configuration_next FOR tab_configuration_03;

您还可以定义:

代码语言:javascript
复制
CREATE VIEW view_configuration AS SELECT * FROM tab_configuration_02;
CREATE VIEW view_configuration_next AS SELECT * FROM tab_configuration_03;

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

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

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

例如:

代码语言:javascript
复制
<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代码。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61479687

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档