繁体   English   中英

通过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
  • 智商3.7.2
  • Postgres 9.5
  • Java 1.8

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

这就是为什么jOOQ不能想当然地认为你的意图,此调用是设置IDDEFAULT jOOQ将假定您确实希望在INSERTUPDATE语句中设置NULL

todoRecord.setId(null);

相反,写

todoRecord.changed(TODO.ID, false);

参见Record.changed(Field, boolean)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM