具有唯一约束的继承表不会生成为UpdatableRecord

时间:2017-07-07 08:37:08

标签: java sql jooq

我有以下表格定义:

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);

我希望将第二个表生成为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()实现完全相同。

此行为是否符合预期?除了上面提到的内容之外,还有解决方法吗?

1 个答案:

答案 0 :(得分:0)

经过一些研究,我读完了JOOQ docs,其中说明了:

任何记录都可以更新,如果

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

  • 其基础表或视图具有“主要唯一键”,即主键或至少一个唯一键

据我所知,我的syntax: fun.bind(thisArg[, arg1[, arg2[, ...]]]) 表(由于缺少PK)没有满足条件一,而条件二已经完成。根据文档的措辞,我可以推测,child成为Record时,两者都必须成立。就此而言 - 这种JOOQ行为是正确的和预期的。

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

UpdatableRecord

虽然这非常麻烦且容易出错,但很可能无法解决价值未被刷新的问题。现在我将不得不使用Java的dslContext.update.<...>.setMemberUuid(select("select uuid_generate_v4()")).<...>方法,直到有更好的方法出现。