我有以下表格定义:
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()
实现完全相同。
此行为是否符合预期?除了上面提到的内容之外,还有解决方法吗?
答案 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()")).<...>
方法,直到有更好的方法出现。