在编写记录时,jOOQ尝试为Identity列写入值

时间:2014-09-27 17:50:27

标签: postgresql jooq

我有一个简单的方法(使用jooq),基本上是这样做的:

MyObject myObject = ...;
MyObjectRecord myObjectRecord = MyConvertor.convertor(myObject);

DSLContext create = ...;
create.insertInto(Tables.MY_OBJECT)
      .set(MyObjectRecord)
      .execute();

在'MY_OBJECT'表中,我有一个字段'id',定义为:

id SERIAL NOT NULL;

每当我运行上面提到的代码时,我都会收到错误:

Exception in thread "main" org.jooq.exception.DataAccessException: SQL [insert into "public"."myobject" ("somefield", "id") values (?, ?)];
ERROR: null value in column "id" violates not-null constraint
Failing row contains (somevalue, null).

正如我所看到的,问题是jOOq正在尝试将值写入标识列。 MyConvertor将其保持为null的原因是因为该值将由db生成。如何让jooq不尝试将null写入此字段?

1 个答案:

答案 0 :(得分:0)

我认为您想要做的是明确定义您想要set的列和值,而不是通过insert传递整个对象,因为您只需要insert a他们的子集。

例如:

create.insertInto(Tables.MY_OBJECT, "somefield")
      .values(MyObjectRecord.getSomeField()).execute();

假设MyObjectRecord有一个getSomeField方法,可以检索该字段的值。

insertInto的第一个参数是表名,后跟列名的vararg列表。 values然后获取列值的vararg列表。这允许您指定特定的列/值对,它们是整个对象的子集。

您也可以使用set样式,但是将列/值对作为参数进行枚举,即:。

create.insertInto(Tables.MY_OBJECT)
      .set("somefield", MyObjectRecord.getSomeField())
      .execute();

注意:未经测试,但我认为上述之一(或两者)应该有效。

根据OP的评论进行编辑:

确定...如果您使用的对象版本根本不包含id列,那么 jOOQ 将无法使用它?你可能有一个没有id列的基础对象,然后有一个派生的对象,它会在你需要的时候在顶部添加id列。