JOOQ: логически группировать столбцы из разных таблиц в едином интерфейсе - PullRequest
0 голосов
/ 26 сентября 2018

У нас есть дизайн таблицы, в котором множество таблиц совместно используют несколько столбцов, например, в одном случае некоторые из наших таблиц имеют столбец markedForDeletion.В другом случае несколько наших таблиц имеют столбцы approvedAt и approvedBy.Эти таблицы не имеют ничего общего с точки зрения данных JOINED, и поэтому я не хотел бы представлять общую таблицу JOIN для них (это также не вариант из-за проблем с производительностью).

Но изс точки зрения приложения, у меня есть довольно похожие задачи, которые нужно выполнить здесь.Например, если я создаю новую строку, не имеет значения, в какую из таблиц я вставляю запись, мне нужно извлечь из запроса утверждающего и время запроса, чтобы заполнить его в моей таблице вместе с другой строкой.данные позже в моем коде.

В JOOQ я теперь могу делать что-то вроде

private void insertApprovalInformation(Record record, RequestContext ctx) {
   record.set(DSL.field("approver"), ctx.getRequestUser());
   record.set(DSL.field("approvedAt"), ctx.getRequestTime());
}

Однако с этим подходом я потеряю всю свою безопасность любимого типа.В идеале я хотел бы написать что-то вроде

private void insertApprovalInformation(Approvablerecord record, RequestContext ctx) {
   record.set(ApprovableTable.APPROVER, ctx.getRequestUser());
   record.set(ApprovableTable.APPROVED_AT, ctx.getRequestTime());
}

Я знаю, что это похоже на функцию наследования Postgres, но я бы хотел, чтобы это было более независимым от базы данных, и хотел бы использовать его вбаза данных Oracle.Я представляю что-то вроде настройки генератора JOOQ и говорю ему: «Эти четыре таблицы принадлежат логической группе, которую я называю« утвержденной », и у них всех есть столбцы APPROVER и APPROVED_AT».что позволит JOOQ генерировать классы, например, реализующие интерфейс маркера для этой группы.

Я думаю, что это может быть довольно часто используемой функцией при рассмотрении истории, общих задач, таких как утверждение, пометка строк для удаления и так далее.

Мои вопросы:

  • В JOOQ уже есть способ достичь безопасного по типу результата, как я желаю?
  • Любые другие предложения о том, как подойти к этому сценариюбезопасным способом?
  • Или я должен просто забыть о безопасности типов здесь?

1 Ответ

0 голосов
/ 28 сентября 2018

Вы можете легко настроить и расширить генератор кода jOOQ, чтобы добавить информацию о типе для вас.Поскольку вы хотите работать с сгенерированными записями, просто добавьте новый интерфейс, подобный этому, в свою базу кода:

public interface Approvable {
    void setApprover(String approver);
    void setApprovedAt(Timestamp approvedAt);
}

, а затем настройте генератор кода, чтобы все соответствующие сгенерированные записи реализовывали описанный выше интерфейс с помощью генератора.стратегия:

Пример конфигурации:

..
<generator>
  <strategy>
    <matchers>
      <tables>
        <table>
          <expression>MY_TABLE</expression>
          <recordImplements>com.example.Approvable</recordImplements>
        </table>
      </tables>
    </matchers>
  </strategy>
</generator>
...