使用 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);
}
版本
- dropwizard 0.8.5
- jOOQ 3.7.2
- Postgres 9.5
- Java1.8
一些数据库允许在键中使用 NULL
值。或者,您可能有一个触发器来侦听在主键上设置的 NULL
值。
这就是为什么 jOOQ 不能假定您对这个调用的意图是将 ID
设置为 DEFAULT
。 jOOQ 将假定您确实希望在 INSERT
或 UPDATE
语句中设置 NULL
:
todoRecord.setId(null);
改为写
todoRecord.changed(TODO.ID, false);
对于 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);
}
版本
- dropwizard 0.8.5
- jOOQ 3.7.2
- Postgres 9.5
- Java1.8
一些数据库允许在键中使用 NULL
值。或者,您可能有一个触发器来侦听在主键上设置的 NULL
值。
这就是为什么 jOOQ 不能假定您对这个调用的意图是将 ID
设置为 DEFAULT
。 jOOQ 将假定您确实希望在 INSERT
或 UPDATE
语句中设置 NULL
:
todoRecord.setId(null);
改为写
todoRecord.changed(TODO.ID, false);