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_json
将ROW
s 的数组解析为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 注释