设置:
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同义词吗?
这确实是一个有用的功能,但是,从3.13:https://github.com/jOOQ/jOOQ/issues/1563开始,它尚未在jOOQ中实现。
Oracle不会通过SYS.ALL_TABLES
或SYS.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中已经可以使用。优点:您可以访问带有数字后缀的实际表(如果需要)或视图。您可以在数据库中更新视图定义,而无需更改客户端代码,即无需重新生成它(假设所有表都相同)。
您可以使用“生成器策略”来定义生成的类名称和标识符名称:
例如:
<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代码。