使用 JOOQ 生成的 UpdatableRecordImpl from() 方法时如何遵守默认值

问题描述 投票:0回答:1

在此处使用 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
方法彼此区分以利用默认值?

谢谢

java mysql jooq jooq-codegen
1个回答
0
投票

错误

这是 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

© www.soinside.com 2019 - 2024. All rights reserved.