WildFly часовой пояс с JPA - PullRequest
0 голосов
/ 02 мая 2018

В настоящее время я разрабатываю проект с Hibernate и WildFly. База данных, которую я использую - mariaDB.

Когда я вставляю java.time.Instant в базу данных, JPA применяет два часа к вставленной метке времени (которая всегда равна UTC в коде Java).

Я попытался запустить WildFly с -Duser.timezone=UTC в standalone.conf (Java Opts) и аргументе командной строки. Консоль управления показывает этот часовой пояс, но все выходные данные журнала и входные данные базы данных находятся в моем системном часовом поясе (+2). Когда я устанавливаю свой часовой пояс Windows в UTC, странное поведение прекращается, и время в базе данных корректно.

Я также попытался установить свойство гибернации <property name="hibernate.jdbc.time_zone" value="UTC"/> и на моем mariaDB SET GLOBAL time_zone = "+00:00", который также не работал.

Что мне здесь не хватает?

Ответы [ 2 ]

0 голосов
/ 15 мая 2018

Таким образом, ответ на эту проблему был довольно простым.

Я использовал версию Hibernate, упакованную с WildFly12 - 5.1.10. По словам Крис Крэнфорд

настройка hibernate.jdbc.time_zone не была введена до 5.2.3

хотя здесь не было выдано никакой ошибки. Обновление Hibernate поможет.

  1. Перейдите в wildfly-12.0.0.Final \ modules \ system \ layer \ base \ org \ hibernate \ main
  2. Загрузите библиотеку core и envers и поместите ее в папку.
  3. Измените module.xml, обновите версии и удалите -java8- * и entitymanger - *. Jar -> они отменены и перемещены в ядро.
  4. Перезапустите WildFly, и ваши проблемы исчезнут.

Может быть, есть веская причина, почему команда WildFly не использовала более новую версию Hibernate, но я не уверен, почему. Так что может случиться так, что у вас есть некоторые ошибки / нежелательное поведение с замененными библиотеками.

На самом деле, простое сообщение об ошибке, что свойство неизвестно, могло бы спасти меня некоторое время. Либо я не нашел его в логах, либо это просто не ошибка ...

0 голосов
/ 09 мая 2018

Если вы хотите быть уверены, что ваше Java-приложение всегда будет с UTC, вы должны переопределить часовой пояс JVM при запуске приложения.

TimeZone.setDefault(TimeZone.getTimeZone("UTC"));

Источник

Как программно установить часовой пояс в Java?

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

Этот код должен быть добавлен при запуске приложения. Это зависит от используемой вами платформы.

Для JEE5 + вы можете создать синглтон бустрап EJB:

@Singleton
@Startup
public class StartupBean {

    @PostConstruct
    private void startup() {
        TimeZone.setDefault(TimeZone.getTimeZone("UTC"));
    }
}

Для Springboot 1.5 + вы можете создать хук в любом месте с помощью этого:

@EventListener(ApplicationReadyEvent.class)
public void doSomethingAfterStartup() {
    TimeZone.setDefault(TimeZone.getTimeZone("UTC"));
}
...