使用 jOOQ 传递空主键以使其由数据库设置

Pass null primary key with jOOQ to have it set by the database

对于 REST 服务,我收到了一个要保存在数据库中的对象。我想阻止用户设置 id。相反,数据库应该从序列中自动分配值,例如 Postgresql 的 SERIAL。

如果我尝试将 jOOQ 生成的记录中的 id 置空,当我尝试存储它时数据库会出错。

这是相关的 DDL。

CREATE TABLE todo (
  id SERIAL PRIMARY KEY,
  title TEXT,
  url TEXT
);

这是相关代码。 todo-backend.

处的完整代码
@POST
public Todo addTodo(Todo todo, @Context DSLContext db) {
    final TodoRecord todoRecord = db.newRecord(TODO, todo);

    // This errors out, violates not-null constraint on DB
    todoRecord.setId(null);

    todoRecord.store();

    todoRecord.setUrl("http://localhost:8080/" + todoRecord.getId());
    todoRecord.store();

    return db.selectFrom(TODO)
            .where(TODO.ID.eq(todoRecord.getId()))
            .fetchOneInto(Todo.class);
}

版本

一些数据库允许在键中使用 NULL 值。或者,您可能有一个触发器来侦听在主键上设置的 NULL 值。

这就是为什么 jOOQ 不能假定您对这个调用的意图是将 ID 设置为 DEFAULT。 jOOQ 将假定您确实希望在 INSERTUPDATE 语句中设置 NULL

todoRecord.setId(null);

改为写

todoRecord.changed(TODO.ID, false);

Record.changed(Field, boolean)