具有唯一约束的继承 table 不会生成为 Updatable 记录

Inherited table with unique constraint is not generated as an UpdatableRecord

我有以下 table 定义:

CREATE TABLE parent
(
  id bigserial NOT NULL,
  info text,
  member_uuid uuid NOT NULL DEFAULT uuid_generate_v4(),
  CONSTRAINT parent_pkey PRIMARY KEY (id)
);

CREATE TABLE child
(
-- Inherited from table parent:  id bigint NOT NULL DEFAULT nextval('parent_id_seq"::regClass),
-- Inherited from table parent:  info text
-- Inherited from table parent:  member_uuid uuid NOT NULL DEFAULT uuid_generate_v4(),
  member_info text,
  CONSTRAINT child_member_uuid_unique UNIQUE (member_uuid)
)
INHERITS (parent);

我希望将第二个 table 生成为 JOOQ POJO 并能够对其进行操作。特别是,我希望能够做到以下几点:

ChildRecord record = dslContext.newRecord(CHILD)
                               .setMemberInfo(...)
                               .insert();
record.getMemberUuid(); // autogenerated upon insert

但是,在上述情况下,根据给定的定义,JOOQ 会生成以下 POJO:

public class ChildRecord extends TableRecordImpl<ChildRecord> implements Record4<Long, String, UUID, String>

这不是 UpdatableRecord。这意味着我无法在此记录上调用 refresh() 并且自动生成的 UUID 值不可用:

ChildRecord record = dslContext.newRecord(CHILD)
                               .setMemberInfo(...)
                               .insert();
record.getMemberUuid(); // null

有一个解决方法,有点脏:

ChildRecord record = dslContext.newRecord(CHILD)
                               .setMemberInfo(...)
                               .setMemberUuid(UUID.randomUUID())
                               .insert();
record.getMemberUuid(); // available

但是,无法保证 uuid_generate_v4() 实施始终与 java UUID.randomUUID() 实施完全相同。

这种行为是'as expected'吗?除了我上面提到的以外,还有其他解决方法吗?

经过更多研究后,我通读了 JOOQ docs,其中说明:

任何记录都可以更新table, if

  • 它表示来自 table 或视图的记录 - TableRecord

  • 其底层table或视图有一个"main unique key",即一个主键或至少一个唯一键

据我所知,我的childtable不满足条件一(因为没有PK),而条件二是满足的。根据文档的措辞,我可以推测 both 需要为真才能使 Record 成为 UpdatableRecord。就此而言 - 此 JOOQ 行为是正确的并且符合预期。

不幸的是,这并没有解决使用应该自动生成的值的问题。一种可能的解决方法是使用 SQL 语句,例如:

dslContext.update.<...>.setMemberUuid(select("select uuid_generate_v4()")).<...>

虽然这非常繁琐且容易出错,而且很可能无法解决值不刷新的问题。现在我将不得不接受 Java 的 UUID.randomUUID() 方法,直到出现更好的方法。