简体   繁体   中英

Inherited table with unique constraint is not generated as an UpdatableRecord

I have the following table definitions:

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

I wish to generate the second table as a JOOQ POJO and be able to manipulate it. In particular, I wish to be able to do the following:

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

However, in the above case with the given definition, JOOQ generates the following POJO:

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

Which is not an UpdatableRecord . This means that I am unable to call refresh() on this record and that the autogenerated UUID value is not available:

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

There is a workaround, which is a bit dirty:

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

However, there is no guarantee that the uuid_generate_v4() implementation is always going to be exactly the same as the java UUID.randomUUID() implementation.

Is this behaviour 'as expected'? Is there a workaround aside from what I have mentioned above?

After some more research, I read through the JOOQ docs , which state:

Any Record can be updatable, if

  • it represents a record from a table or view - a TableRecord

  • its underlying table or view has a "main unique key", ie a primary key or at least one unique key

As far as I can see, condition one is not fulfilled by my child table (due to the lack of a PK), while condition two is fulfilled. By the wording of the docs, I can surmise that both of these need to be true for the Record to be an UpdatableRecord . Insofar - this JOOQ behaviour is correct and as-expected.

Unfortunately this does not solve the issue of using values that should be autogenerated. One possible workaround might be to use an SQL statement like:

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

though this is extremely cumbersome and rather error-prone, and most likely will not solve the issue of the value not being refreshed. For now I will have to live with Java's UUID.randomUUID() method, until something better comes along.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM