НУЛЕВОЕ значение для LocalDateTime JPA 2.2 — PostgreSQL

#java #postgresql #jpa #eclipselink #jpa-2.2

#java #postgresql #jpa #eclipselink #jpa-2.2

Вопрос:

Я не могу установить нулевое значение для поля, описанного ниже. Я хочу вставить NULL в качестве значения по умолчанию.

 @Column(name = "answer_date",columnDefinition = "TIMESTAMP")
private LocalDateTime answerDate
  

Когда я устанавливаю значение NULL, отображается следующая ошибка:

 Caused by: org.postgresql.util.PSQLException: ERROR: column "answer_date" is of type timestamp without time zone but expression is of type character varying 
  

Я использую EclipseLink в качестве реализации JPA.

Комментарии:

1. Ты сделал answerDate = null; ? (Я склонен использовать «DATETIME», хотя это не должно иметь значения.)

2. Да, я сделал вручную. Но значение null уже является значением по умолчанию в Java. Проблема возникает при выполнении действий с базой данных.

Ответ №1:

Я думаю, что это известная проблема. Ссылки на ссылки

(typeorm также сталкивается с той же проблемой).

Да, сообщение об ошибке приходит от драйвера postgres jdbc. Причиной этой ошибки является eclipselink, использующий varchar в качестве типа данных для значения ‘null’. Другие драйверы могут игнорировать или не игнорировать этот неправильный тип данных, драйвер postgres этого не делает.

Когда вы пытаетесь установить для answerDate значение null, оно превращается в строку «null», которая отправляется в базу данных postgres и вызывает эту ошибку, поскольку «null» не является допустимым форматом метки времени.

Лучше, если вы назначите значение по умолчанию на случай, если LocalDateTime отсутствует.

 private LocalDateTime answerDate = LocalDateTime.now();
  

В этом случае это сообщение об ошибке, в котором говорится «имеет тип timestamp … но
выражение имеет тип text ..» можно избежать.

ОБНОВЛЕНИЕ Ошибка исправлена в EclipseLink версии 2.7.6 (https://github.com/eclipse-ee4j/eclipselink/pull/415)

Комментарии:

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

2. Я попытался решить вашу проблему в моем локальном, явно установив временную метку как null, но у меня это работает. Я использую зависимость spring-boot-starter-data-jpa 2.2.0.RELEASE, а в application.properties мой диалект jpa называется spring.jpa.properties. гибернация.диалект: org.hibernate.dialect. PostgreSQLDialect

3. Спасибо за вашу помощь. Вы использовали LocalDateTime в качестве типа объекта Java? Я использую EclipseLink вместо гибернации :/

4. Я использовал java.time. Само LocalDateTime. Но я использую spring-data-jpa. Я не знаком с EclipseLink. Позвольте мне проверить и посмотреть, есть ли какое-либо решение.

5. Пожалуйста, посмотрите эту ссылку: bugs.eclipse.org/bugs/show_bug.cgi?id=535431 и bugs.eclipse.org/bugs/show_bug.cgi?id=546312 . Я думаю, что это была известная проблема, как в typeorm. Во второй ссылке говорится, что версия 2.7.6 EclipseLink устранила эту проблему. Можете ли вы обновить версию EclipseLink и попробовать?

Ответ №2:

Может быть, это будет кому-то полезно. У меня была та же ошибка (я использовал EclipseLink, Websphere и PostgreSQL). После обновления EclipseLink до 2.7.8 я продолжал получать ту же ошибку. После нескольких часов поиска я нашел следующее решение:

Добавить свойство к источнику данных в server.xml

 stringType="unspecified"
  

или установите stringType=unspecified в качестве параметра запроса URL Postgres