Более простой способ использовать транзакции в JOOQ - PullRequest
1 голос
/ 03 августа 2020

Мы используем генерацию кода JOOQ, которая работает как шарм. В 99% случаев мы просто повторно используем DAO, созданные JOOQ. Для одного варианта использования нам нужно использовать транзакции.

Я смотрю на другие вопросы, например, здесь JOOQ и транзакции и использую транзакции JOOQ для вставки строк в две таблицы как транзакция . Таблицы довольно большие, с 15+ столбцами, и я думаю, есть ли лучший способ сделать это, кроме

DSL.using(configuration)
   .transaction(ctx -> {
       DSL.using(ctx)
          .update(TABLE)
          .set(TABLE.COL, newValue)
          .where(...)
          .execute();
   });

Указание 15 столбцов кажется большой работой, которую нужно переделывать, когда новые добавлены столбцы et c. У нас уже есть POJO, есть ли способ просто преобразовать POJO в запись, просто используя синтаксис DSL.

1 Ответ

1 голос
/ 04 августа 2020

Вы можете преобразовать POJO в такую ​​запись:

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

Это установит все столбцы в таблице, что может быть нежелательным (например, вы можете не захотеть установить первичный ключ на себя). Чтобы предотвратить включение определенных полей, используйте Record.changed(Field, boolean), чтобы сбросить внутренний флаг изменения для каждого столбца.

В качестве альтернативы, если ваше предложение WHERE является просто предикатом для первичного ключа , вы также можете просто использовать UpdatableRecord.update():

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