JOOQ 似乎完全忽略了数据库列的默认值。既不会更新 ActiveRecord 对象,也不会在 INSERT 上跳过此列。相反,它尝试将其设置为 NULL,这在 NOT NULL 列上失败。
例子:
CREATE TABLE bug (
foo int,
bar int not null default 42
);
BugRecord b = jooq.newRecord(BUG);
b.setFoo(3);
b.store();
assertNotNull(b.getBar()); // fails
Record r = jooq.select().from(BUG).fetchOne();
assertEquals(new Integer(-1), r.getValue(BUG.BAR)); // fails
// DataMapper pattern
Bug b = new Bug();
b.setFoo(3);
bugDao.insert(b); // Fails because it tries to set "bar" to NULL
我期望的行为是 newRecord() 使用 korrekt 值初始化所有默认变量(尽管我知道如果结果是自定义函数的结果,这可能会很困难:-))。或者 INSERT INTO 确实不要使用默认值插入所有未修改的列,然后在 INSERT INTO 后跟一个 SELECT,该 SELECT 从数据库中获取现在存在的值(类似于 RETURNING)。
这真的是一个错误/限制,还是我错过了一些配置选项等,从而可以使用“非空默认”列?