Почему JPA не поддерживает java.time.Instant?

Я думаю, что java.time.Instant - лучший выбор для сохранения даты в БД: это наиболее вероятный TIMESTAMP, и вы не зависите от часового пояса, это всего лишь момент времени.

JPA поддерживает LocalDate, LocalTime, LocalDateTime и т.д., Но не Instant. Конечно, вы можете использовать либо AttributeConverter, либо некоторые библиотеки, такие как Jadira, но почему это не поддерживается из коробки?

Ответы

Ответ 1

Я попробую это снова. В есть обсуждение. Последнее обсуждение выглядит так:

mkarg сказал: хотя это абсолютно правильно, технический ответ немного сложнее: какой последний предикат делает тип данных право на включение в набор обязательных сопоставлений типов?

Можно сказать, что предикат является "существенным" или "общим" использовать ", но кто определяет, что такое" основное "или" общее использование "? некоторые приложения, поддержка java.awt.Image и java.net.URL могут быть гораздо более важным, чем поддержка LocalDate или ZonedDateTime. На с другой стороны, другие приложения могут быть заполнены LocalDate, но никогда не использует Instant Так где именно сделать разрез? Это становится особенно сложный, если посмотреть на огромное количество найденных типов в JRE, и очевидно, что где-то должен быть разрез. Четный JavaFX, входящий в комплект JRE, по-прежнему не поддерживает Instant в v8, так зачем же JPA? И, глядя на текущий прогресс Проект Jigsaw, возможно, предикат квалификации может быть просто ответил "все типы в определенном модуле головоломки"?

В любом случае, это не мое решение. Я поддерживаю вашу просьбу, и хотелось бы увидеть поддержку для всех времен Java Time API, особенно для Instant и Duration, и ваш запрос имеет видное сторонники, как например, Java чемпион Арун Гупа, как я узнал относительно недавно. Но я сомневаюсь, что окончательный ответ будет так же просто удовлетворительным как мы хотели бы иметь это.

Может быть, было бы лучше просто установить другую JSR, например, "Common Преобразование типов данных для платформы Java ", которая предоставляет гораздо больше сопоставления, а не только дата и время, но также не будут связаны с JPA но также может использоваться JAXB, JAX-RS и, возможно, более API, дело в чем проблема превращения "в"? Наличие такого транспортного средства действительно уменьшит шаблон.

TL-DR; Есть много типов. Мы должны были провести черту где-то.

Существует новая проблема, которая будет добавлена в будущую версию JPA.

Еще один интересный анализ, который я нашел в ветке Дугласа Сурбера (работает в JDBC):

  Версия JDBC для JDK 8 включает поддержку большинства типов SQL   что соответствует 310 классам.

  •         ДАТА - LocalDate
  •   ВРЕМЯ - LocalTime
  •   TIMESTAMP с зоной вне времени - LocalDateTime
  •   TIMESTAMP с зоной времени - OffsetDateTime

        Версия JDBC для JDK 8 не включает отображение между ИНТЕРВАЛОМ   типы и соответствующие 310 классов.

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

     Я настоятельно рекомендую разработчикам JDBC использовать новые 310   классы. Есть проблемы с java.util.Date, java.sql.Date,   java.sql.Time и java.sql.Timestamp. Вы должны рассмотреть их   осуждается. 310 классов значительно выше.

     Дуглас

TL: DR; Мы просто выбрали один тип Java 8 для каждого из 4 возможных способов хранения временных данных в базе данных.

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

Ответ 2

Это не проблема JPA, а проблема JDBC.

JDBC поддерживает Date, Timestamp, LocalDate, LocalTime и LocalDateTime, но NOT Instant.

Это не проблема Java, а проблема SQL, при которой то, что хранится в базе данных, составляет конструкцию year-month-day-hour-minute-second.

Подумайте о функциях SQL: YEAR() MONTH() и т.д....

Эти функции не могут быть применены к простым миллисансодам с номера 1970 года. Для выполнения этих функций требуется конструкция LocalDateTime.