具有唯一约束的继承 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",即一个主键或至少一个唯一键
据我所知,我的child
table不满足条件一(因为没有PK),而条件二是满足的。根据文档的措辞,我可以推测 both 需要为真才能使 Record
成为 UpdatableRecord
。就此而言 - 此 JOOQ 行为是正确的并且符合预期。
不幸的是,这并没有解决使用应该自动生成的值的问题。一种可能的解决方法是使用 SQL 语句,例如:
dslContext.update.<...>.setMemberUuid(select("select uuid_generate_v4()")).<...>
虽然这非常繁琐且容易出错,而且很可能无法解决值不刷新的问题。现在我将不得不接受 Java 的 UUID.randomUUID()
方法,直到出现更好的方法。
我有以下 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",即一个主键或至少一个唯一键
据我所知,我的child
table不满足条件一(因为没有PK),而条件二是满足的。根据文档的措辞,我可以推测 both 需要为真才能使 Record
成为 UpdatableRecord
。就此而言 - 此 JOOQ 行为是正确的并且符合预期。
不幸的是,这并没有解决使用应该自动生成的值的问题。一种可能的解决方法是使用 SQL 语句,例如:
dslContext.update.<...>.setMemberUuid(select("select uuid_generate_v4()")).<...>
虽然这非常繁琐且容易出错,而且很可能无法解决值不刷新的问题。现在我将不得不接受 Java 的 UUID.randomUUID()
方法,直到出现更好的方法。