Я видел этот вопрос несколько раз в 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, которая бы работала, но это не так. Итак, я думаю, что все делаю правильно, и у меня все еще есть проблема.
Итак, если вам нужно что-то увидеть, дайте мне знать, и я могу добавить это. Я думаю, что все делаю правильно, но если что-то не так, я должен исправить, пожалуйста, дайте мне знать. И, конечно, я сам буду продолжать смотреть на это.