在 JOOQ 中使用交易的更简单方法

Easier way to use transactions in JOOQ

我们使用 JOOQ 代码生成,效果非常好。对于 99% 的用例,我们只是重用 JOOQ 生成的 DAO。对于一个用例,我们需要使用事务。

我正在查看其他问题,例如此处 JOOQ & transactions 的问题,并使用 JOOQ 事务将行作为 事务 插入到两个表中。 表格很大,有 15 列以上,我在想是否有比

更好的方法来做到这一点
DSL.using(configuration)
   .transaction(ctx -> {
       DSL.using(ctx)
          .update(TABLE)
          .set(TABLE.COL, newValue)
          .where(...)
          .execute();
   });

指定 15 列似乎需要大量工作,在添加新列等时必须重做。我们已经有了 POJO,有什么方法可以简单地将 POJO 转换为记录并简单地使用 DSL 语法。

您可以像这样将 POJO 转换为记录:

ctx.dsl()
   .update(TABLE)
   .set(ctx.dsl().newRecord(TABLE, pojo))
   .where(...)
   .execute();

这将设置 所有 table 中的列,这可能是不希望的(例如,您可能不想将主键设置为其自身)。要防止包含某些字段,请使用 Record.changed(Field, boolean),以重置每列的内部更改标志。

或者,如果您的 WHERE 子句只是主键上的谓词,您也可以只使用 UpdatableRecord.update():

ctx.dsl().newRecord(TABLE, pojo).update();