Постоянство LocalDate MySQL возвращается на дату раньше - PullRequest
0 голосов
/ 22 января 2019

Я видел этот вопрос несколько раз в StackOverflow, и в основном это были приложения Spring Boot с Spring Boot Configuration. Я выполнил все шаги, и у меня все еще есть эта проблема. Если я не смогу решить эту проблему в ближайшее время, мне придется вернуться к старому java.util.Date, чтобы сохранить мои данные в базе данных ... по крайней мере, это работало без проблем. Итак, у меня есть приложение Spring 5.1.2.Release с Hibernate 5.4.0.Final, зависимостью hibernate-java8 и последней версией MySQL Connector 8.0.13.

Из предыдущих сообщений и других статей в сети я понимаю, что если база данных настроена на UTC, но приложение работает в другом часовом поясе, в моем случае GMT-5 для EST, то эта проблема может появиться.

Итак, вот технические детали: Мое соединение MySQL выглядит так:

hibernate.connection.url=jdbc:mysql://localhost:3306/my_db? 
serverTimezone=UTC&useLegacyDatetimeCode=false&useTimezone=true

Строка подключения, используется в applicationContext.xml:

<bean id="dataSource"
    class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName">
        <value>${hibernate.connection.driver.class}</value>
    </property>
    <property name="url">
        <value>${hibernate.connection.url}</value>
    </property>
    <property name="username">
        <value>${hibernate.connection.username}</value>
    </property>
    <property name="password">
        <value>${hibernate.connection.password}</value>
    </property>
</bean>

Мои свойства Hibernate в моем applicationContext.xml выглядят так:

<property name="hibernateProperties">
        <props>
            <prop key="hibernate.dialect">${hibernate.dialect}</prop>
            <prop key="hibernate.show_sql">${hibernate.show_sql}</prop>
            <prop key="hibernate.cglib.use_reflection_optimizer">${hibernate.cglib.use_reflection_optimizer}</prop>
            <prop key="useUnicode">true</prop>
            <prop key="useLegacyDatetimeCode">false</prop>
            <prop key="serverTimezone">UTC</prop>
            <prop key="useTimezone">true</prop>
            <prop key="hibernate.jdbc.time_zone">UTC</prop>
        </props>
    </property>

Мои зависимости Maven:

    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>8.0.13</version>
    </dependency>
    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-core</artifactId>
        <version>5.4.0.Final</version>
    </dependency>
    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-java8</artifactId>
        <version>5.4.0.Final</version>
    </dependency>

Код моей сущности прост:

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "transaction_id")
private long txId;

@Column(name = "transaction_date")
private LocalDate txDate;

Я сохраняю свой код в базе данных следующим образом:

@Override
public TxEntity create(TxEntity txEntity)
{
    this.sessionFactory.getCurrentSession().save(txEntity);
    this.sessionFactory.getCurrentSession().flush();
    this.sessionFactory.getCurrentSession().refresh(txEntity);
    return txEntity;
}

В базе данных в качестве поля DATE в MySQL указана "транзакция_даты".

Мой модульный тест показывает, что я могу создать новую запись, и я установил дату следующим образом:

      LocalDate today = LocalDate.now();

Я сохраняю запись, и когда я проверяю:

assertEquals(today, myRecord.getTransactionDate());

это не получается, потому что я получаю предыдущую дату.

Я думал, что если бы я использовал последние версии Hibernate и Hibernate-java8, то все было бы в порядке, но это не так. Я думал, если бы я использовал последнюю версию JPA2.2, которая бы работала, но это не так. Итак, я думаю, что все делаю правильно, и у меня все еще есть проблема.

Итак, если вам нужно что-то увидеть, дайте мне знать, и я могу добавить это. Я думаю, что все делаю правильно, но если что-то не так, я должен исправить, пожалуйста, дайте мне знать. И, конечно, я сам буду продолжать смотреть на это.

1 Ответ

0 голосов
/ 26 июня 2019

Если вы не хотите прикасаться к своему проекту Java или строкам подключения для решения этой проблемы, вы можете напрямую настроить часовой пояс MySQL.На моем компьютере часовой пояс JVM был правильным (America / Sao_Paulo), поэтому изменение его на UTC для разрешения этого конфликта с MySQL было бесполезным.

Проблема, с которой я столкнулся, заключалась только в конфигурации часового пояса MySQL.Так как я запускаю MySQL для контейнера, он получил неправильный часовой пояс по умолчанию.Исправление состояло в том, чтобы передать --default-time-zone=America/Sao_Paulo в конфигурацию контейнера MySQL, которая исправила эту проблему.Теперь и MySQL, и JVM получили одинаковый часовой пояс.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...