在 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();
我们使用 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();