在此处使用 DAO 插入/更新时,似乎已经做了一些工作来尊重默认值:https://github.com/jOOQ/jOOQ/issues/2700.
这很好,但是当我还在
from
上使用生成的 UpdatableRecordImpl
方法时,我正在努力利用它。具体来说,在生成UpdatableRecordImpl
时,我们提供了一个from
方法来将实现记录接口的实体转换为记录,但是,如果您使用此方法,则将不支持DEFAULT字段,因为from
方法设置实体上的所有字段,包括应该默认的字段,当它们未设置时,它们将在记录中设置为空。
例如,如果我们有一张水果表,只有一列
alter table fruit
add column color varchar(6) not null default 'red';
JOOQ 将在字段
IFruit
上生成一个带有 getter/setter 的接口color
。然后我们将生成一个 FruitRecord
类,它使用 UpdatableRecordImpl<FruitRecord>
方法扩展 from
,如下所示:
@Override
public void from(IFruit from) {
setColor(from.getColor());
}
如果我们使用这个
from
方法,颜色将被显式设置为null
如果它没有在from对象中设置。发生这种情况时,插入记录时将失败,因为颜色不能为空并且不会使用默认颜色。如果记录对象中根本没有设置该字段,我相信 JOOQ 会以使用 DEFAULT 值的方式处理该字段,因此使用默认值正确插入它。
我还没有深入研究这些生成的类等,也许我遗漏了一些东西,但是是否有一种现有的方法可以以未设置/空字段的方式使用此
from
方法彼此区分以利用默认值?
谢谢
这是 jOOQ 3.17 及更低版本中的错误:#14727。它将在 jOOQ 3.18 中修复。它与以下组合有关:
NOT NULL
列<interfaces>true</interfaces>
(生成这个稍微优化过的方法)Record.from(Object)
,这违反了 Liskov 原则错误 #14727 的解决方法是手动将类型向上转换为
Object
,以避免调用生成的方法:
IFruit f = ...
record.from((Object) f);
或者,您可以重置
Record
上所有更改的标志,甚至可以使用RecordListener