LocalDateTime и дата в БД не округляются одинаково - PullRequest
0 голосов
/ 21 апреля 2020

Я хочу подписать токен jwt с LocalDateTime, который получен после создания пользователя. После этого мне нужно проверить, является ли jwt действительным, и я достигаю этого с датой, полученной из БД.

Проблема в том, что LocalDateTime при создании содержит наносекунды, а дата из БД - нет, а затем проверка не пройдена.

Я пытаюсь решить эту проблему с помощью форматирования LocalDateTime для отображения даты без наносекунд, но есть другая проблема. LocalDateTime округляется до минимального значения (например, 1,222 равно 1, а 1,777 равно 1), а дата, вставленная в БД, округляется, как и это значение: 1,222 равно 1, 1,777 равно 2, поэтому проверка снова не удалась.

Мне удалось разрешить добавив @Column(columnDefinition = "TIMESTAMP (6)") к моему полю в сущности, и теперь наносекунды также хранятся в БД, и все работает, но я не уверен, что это правильное решение.

Так есть ли лучшее решение? Можно ли как-нибудь округлить LocalDateTime так же, как в БД (и оставить тип поля БД как DATETIME, а не TIMESTAMP), или можно округлить дату БД как LocalDateTime.

Я использую весеннюю загрузку 2.2.4

1 Ответ

0 голосов
/ 24 апреля 2020

Я считаю, что на этот вопрос ответили в комментариях. Поэтому, чтобы это стало понятным всем, я бы хотел подвести итог обсуждавшимся решениям.

  1. Вы сказали, что

    обрежьте LocalDateTime перед сохранением его в база данных, вероятно, лучшее решение, потому что мне не нужны миллисекунды для хранения.

    Это можно сделать так:

        yourLocalTime = yourLocalTime.truncatedTo(ChronoUnit.SECONDS);
    

    Это гарантирует, что значения попадают на целые секунды Дальнейшего усечения или округления не происходит. Поэтому значения согласуются с этим.

  2. По моему мнению, использование TIMESTAMP(6) в базе данных, как вы упомянули в вопросе, является очень хорошим решением.

Я не думаю, что вы захотите это попытаться имитировать c, как ваша база данных округляет значение. Это потребовало бы тщательного тестирования, чтобы убедиться, что вы делаете это точно так же, как и во всех ключевых случаях. Мы, вероятно, не знаем, использует ли база данных «округление даже», «округление до половины» или какое-либо другое округление. И мы можем даже не быть уверены, изменится ли он в следующей версии ядра базы данных.

Ссылка: Статья в Википедии: Округление

...