jOOQ 和自动生成,如何避免表 POJO 中的 UDT 记录

Posted

技术标签:

【中文标题】jOOQ 和自动生成,如何避免表 POJO 中的 UDT 记录【英文标题】:jOOQ and autogeneration, how to avoid UDT Records inside table POJOs 【发布时间】:2016-05-26 01:00:56 【问题描述】:

我在 PostgreSQL 数据库中定义了一个类型 T 和一个视图 V

CREATE TYPE my_type AS
(
  mt_column1 smallint NOT NULL
);

CREATE VIEW my_view
AS SELECT
   some_column_id integer
   ARRAY(SELECT
      ROW(an_int)::my_type
      FROM a_table
   ) AS my_view_types
  FROM a_regular_table 
  WHERE my_condition_hold);

使用 release 3.7 上的代码生成,我得到了 UDT 记录类 MyTypeRecord 和表记录类 MyViewRecord 和 UDT POJO 类 MyType 和表 POJO 类 MyView .

MyView 生成的类有一个 MyTypeRecord 数组。

public class MyView extends Object implements Serializable, Cloneable, IMyView 

    private static final long serialVersionUID = 1984808170;

    private final Long           some_column_id;
    private final MyTypeRecord[] my_view_types;

在 POJO 中,我希望有一个 POJO 数组,例如:

    private final MyType[] my_view_types;

另一个有趣的事实是,类型的 pojo 和记录位于 udt 文件夹中,而视图位于 tables 文件夹中:也许这有助于找到解决方案/解释。

有没有办法在生成时使 View 成为 pojo-only 转换?


根据要求,我附上了一个工作示例,它按照我的描述生成记录和 POJO。它通过 this 链接与 FileDropper 共享。


我还报告了一个可能的技巧来避免这个问题,如果你真的很绝望,可以使用它。正如in this *** question/answer 报告的那样,jOOQ 即使我们分配一个 POJO 而不是记录,也无法自动将记录数组转换为记录类MyTypeRecord。因此,您可以使用函数array_to_jsonROWs 的数组解析为json。在我的例子中是:

CREATE VIEW my_view
AS SELECT
   some_column_id integer
   array_to_json(ARRAY(SELECT        
        ROW(an_int)::my_type         
      FROM a_table
   ))::json AS my_view_types
  FROM a_regular_table 
  WHERE my_condition_hold);

如果您注册this 绑定,jOOQ 会自动将其转换为 JSON。

【问题讨论】:

我现在从 JavaGenerator 类中看到 UDT POJO 是在表 POJO 之后生成的。也许这是没有将它们放在表 POJO 中的原因。 【参考方案1】:

这是 jOOQ 代码生成器中的一个错误:https://github.com/jOOQ/jOOQ/issues/5103

它只出现在 PostgreSQL 中,当为具有复合类型数组的表生成 POJO 时。我目前没有看到解决方法。

【讨论】:

嗨 Lukas,感谢您的提示。我现在将所有内容映射到 json 中。需要一些额外的映射,但可以工作(而且我在性能上失去了一些东西)。对您的句子“虽然当前正在生成的代码在 PostgreSQL 中仍然有效,但用户不希望在其生成的 POJO 中包含任何 jOOQ 记录依赖项。”的评论。使用 DSLContext 从 DB 到 POJO 的映射也不起作用,因为无法将行转换为记录(来自 here 的相同问题) @JeanValjean:嗯,这个问题应该已经解决了。你确定它仍然盛行吗?您能否展示一个重现它的示例(例如,作为 Stack Overflow 或 user group 上的新问题) 是的,我假设上述链接上的 cmets 也是如此。我将更新我附加到此问题的示例,并将堆栈跟踪发布到您报告的用户组【参考方案2】:

它正在做它正在做的事情的原因是因为View 没有与之关联的PrimaryKey,至少在大多数数据库中没有,我想不出一个会报告一个PrimaryKey 观看。

您可以使用<syntheticPrimaryKeys> 指定生成的主键,也可以使用<overridePrimaryKeys>,如手册的advanced generator configuration 部分所述。

jooq-meta configuration的相关部分:

<!-- A regular expression matching all columns that participate in "synthetic" primary keys,
       which should be placed on generated UpdatableRecords, to be used with

        - UpdatableRecord.store()
        - UpdatableRecord.update()
        - UpdatableRecord.delete()
        - UpdatableRecord.refresh()

       Synthetic primary keys will override existing primary keys. -->
  <syntheticPrimaryKeys>SCHEMA\.TABLE\.COLUMN(1|2)</syntheticPrimaryKeys>

<!-- All (UNIQUE) key names that should be used instead of primary keys on
       generated UpdatableRecords, to be used with

        - UpdatableRecord.store()
        - UpdatableRecord.update()
        - UpdatableRecord.delete()
        - UpdatableRecord.refresh()

        If several keys match, a warning is emitted and the first one encountered will be used.

        This flag will also replace synthetic primary keys, if it matches. -->
  <overridePrimaryKeys>MY_UNIQUE_KEY_NAME</overridePrimaryKeys>

【讨论】:

在我的例子中会怎么样? 此时您的示例是一个不完整的稻草人,您需要发布一个更具体的示例,但文档非常清楚如何定义您希望主键在查看。 尝试一下,然后返回一个具体问题,为什么我的答案不起作用。 我试了一下。除了我现在在视图的 POJO 上有 @Id 注释之外,我看不到我的问题有任何变化。 我添加了一个指向 tar.gz 文件的链接,该文件包含一个带有架构和相应自动生成的类的示例

以上是关于jOOQ 和自动生成,如何避免表 POJO 中的 UDT 记录的主要内容,如果未能解决你的问题,请参考以下文章

JOOQ 生成 pojo 缺少 GeneratedValue 注释

jOOQ 自定义 Pojo 和 DAO 生成

如何使用默认构造函数和设置器生成 pojo

尝试使用 POJO 记录更新表时出现 Java jOOQ 问题

使用 JOOQ 从 POJO 设置字段为空

Jooq 与 POJO 转换器