Java 具有唯一约束的继承表不会作为可更新记录生成
我有以下表格定义:Java 具有唯一约束的继承表不会作为可更新记录生成,java,sql,jooq,Java,Sql,Jooq,我有以下表格定义: 创建表父级 ( id bigserial不为空, 信息文本, 成员uuid uuid NOT NULL默认uuid\u generate\u v4(), 约束父项_pkey主键(id) ); 创建表子项 ( --从表parent:id bigint NOT NULL继承默认nextval('parent\u id\u seq::regClass), --从父表继承:信息文本 --从表父级继承:成员\u uuid uuid NOT NULL默认uuid\u generate\u
创建表父级
(
id bigserial不为空,
信息文本,
成员uuid uuid NOT NULL默认uuid\u generate\u v4(),
约束父项_pkey主键(id)
);
创建表子项
(
--从表parent:id bigint NOT NULL继承默认nextval('parent\u id\u seq::regClass),
--从父表继承:信息文本
--从表父级继承:成员\u uuid uuid NOT NULL默认uuid\u generate\u v4(),
成员信息文本,
约束子项成员唯一唯一唯一(成员唯一唯一)
)
继承(父母);
我希望将第二个表生成为JOOQ POJO,并能够对其进行操作。特别是,我希望能够执行以下操作:
ChildRecord-record=dslContext.newRecord(CHILD)
.setMemberInfo(…)
.插入();
record.getMemberUuid();//插入时自动生成
但是,在上述给定定义的情况下,JOOQ生成以下POJO:
公共类ChildRecord扩展TableRecordImpl实现Record4
它不是可更新记录
。这意味着我无法对此记录调用刷新()
,并且自动生成的UUID值不可用:
ChildRecord-record=dslContext.newRecord(CHILD)
.setMemberInfo(…)
.插入();
record.getMemberUuid();//null
有一个解决办法,有点脏:
ChildRecord-record=dslContext.newRecord(CHILD)
.setMemberInfo(…)
.setMemberUuid(UUID.randomUUID())
.插入();
record.getMemberUuid();//可用
但是,不能保证uuid\u generate\u v4()
实现总是与javauuid.randomuid()实现完全相同
这种行为是否“如预期的那样”?除了我上面提到的以外,还有其他解决办法吗?经过进一步研究,我通读了JOOQ,其中指出:
任何记录都可以更新,如果
- 它表示表或视图中的记录-表记录
- 其基础表或视图具有“主唯一键”,即主键或至少一个唯一键
就我所见,我的子表未满足条件1(由于缺少PK),而条件二已满足。根据文档的措词,我可以推测,这两个都必须为真,才能使记录成为可更新记录
。到目前为止,这种JOOQ行为是正确的,正如预期的那样
不幸的是,这并不能解决使用应自动生成的值的问题。一种可能的解决方法可能是使用SQL语句,如:
dslContext.update..setMemberUuid(选择(“选择uuid\u生成\u v4()”)。
尽管这非常麻烦,而且很容易出错,而且很可能无法解决值不被刷新的问题。目前,我将不得不使用Java的UUID.randomuid()
方法,直到出现更好的方法