Подтвердить что ты не робот

JOOQ - поддержка JSR310

Поддерживает ли jOOQ поддержку JSR310 в сочетании с PostgreSQL? В частности, я пытаюсь использовать следующие классы:

  • java.time.Instant
  • java.time.LocalDate
  • java.time.LocalTime
  • java.time.LocalDateTime

Я храню в следующих типах данных (согласно http://www.postgresql.org/docs/9.1/static/datatype-datetime.html):

  • java.time.Instant: timestamp with timezone
  • java.time.LocalDate: date
  • java.time.LocalTime: time without timezone
  • java.time.LocalDateTime: timestamp without timezone

Правильны ли эти типы данных?

Поддерживает ли jOOQ перевод между java.sql.Timestamp, java.sql.Date и java.sql.Time и четырьмя классами выше (в обоих направлениях)?

4b9b3361

Ответ 1

jOOQ Roadmap

До jOOQ 3.6 официальная поддержка типов даты JSR-310 отсутствовала, поскольку и jOOQ Open Source Edition, и коммерческие издания по-прежнему поддерживали Java 6.

С jOOQ 3.7 это изменяется, поскольку Java 6 поддерживается только в специально построенном коммерческом дистрибутиве, тогда как для стандартных дистрибутивов потребуется Java 8. Соответствующая проблема для этого изменения # 4338.

Другое изменение включает флаг <javaTimeTypes/>, чтобы сообщить генератору исходного кода генерировать типы JSR-310, а не java.sql.Date и подобные типы. По умолчанию для этого флага установлено значение false, поэтому вам необходимо установить его значение true, пока не будет разрешена проблема # 5714.

Использование типов JSR-310 с jOOQ 3.6 или менее

Тем временем вы можете связать нужные типы самостоятельно и позволить генератору кода использовать ваши пользовательские Converter или Binding. См. Соответствующие разделы руководства:

Правильное отображение

Спецификация JDBC 4.2 определяет, какие типы данных JSR-310 должны быть сопоставлены, к каким типам данных JDBC (которые совпадают с пониманием PostgreSQL одна и та же). В частности, спецификация JDBC перечисляет:

  • Добавлена ​​поддержка карты java.time.LocalDate в JDBC DATE.
  • Добавлена ​​поддержка карты java.time.LocalTime в JDBC TIME
  • Добавлена ​​поддержка карты java.time.LocalDateTime в JDBC TIMESTAMP.
  • Добавлена ​​поддержка карты java.time.OffsetTime в JDBC TIME_WITH_TIMEZONE.
  • Добавлена ​​поддержка map java.time.OffsetDateTime в JDBC TIMESTAMP_WITH_TIMEZONE.

Понимание JDBC кажется не совсем правильным, хотя, поскольку несколько баз данных действительно хранят информацию о часовом поясе в типе данных TIMESTAMP WITH TIME ZONE (например, Oracle), см. также этот ответ DBA/StackExchange: https://dba.stackexchange.com/a/59021/2512. Поскольку часовой пояс не сохраняется, ваш подход к отображению java.time.Instant в TIMESTAMP WITH TIME ZONE лучше, потому что тип SQL на самом деле является только меткой времени UTC.

Сказав это, OffsetDateTime все еще можно сопоставить с TIMESTAMP WITH TIME ZONE, но вы не будете знать, какой часовой пояс использовался, когда метка времени была сохранена в PostgreSQL.

Ответ 2

Поддержка JSR-310 теперь доступна в jOOQ 3.9.0 для настройки в коде:

new Configuration()
     .withGenerator(new Generator()
          .withGenerate(new Generate()
              .withJavaTimeTypes(true)));

Та же структура будет применяться в конфигурации xml (Configuration - Generator - Generate - javaTimeTypes)

Следите за https://github.com/jOOQ/jOOQ/issues/5714, чтобы узнать, когда это включено по умолчанию.