Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/81.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 具有唯一约束的继承表不会作为可更新记录生成_Java_Sql_Jooq - Fatal编程技术网

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()
实现总是与java
uuid.randomuid()实现完全相同


这种行为是否“如预期的那样”?除了我上面提到的以外,还有其他解决办法吗?

经过进一步研究,我通读了JOOQ,其中指出:

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

  • 它表示表或视图中的记录-表记录

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

就我所见,我的
子表未满足条件1(由于缺少PK),而条件二已满足。根据文档的措词,我可以推测,这两个都必须为真,才能使
记录成为
可更新记录
。到目前为止,这种JOOQ行为是正确的,正如预期的那样

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

dslContext.update..setMemberUuid(选择(“选择uuid\u生成\u v4()”)。

尽管这非常麻烦,而且很容易出错,而且很可能无法解决值不被刷新的问题。目前,我将不得不使用Java的
UUID.randomuid()
方法,直到出现更好的方法