Hibernate guarda / recupera la fecha menos el día si la aplicación usa otra zona horaria distinta de MySQL
Tengo una aplicación iniciada en tomcat en MACHINE_A con la zona horaria GMT + 3.
Uso un servidor MySQL remoto iniciado en MACHINE_B con la zona horaria UTC.
Usamos spring-data-jpa para la persistencia.
Como ejemplo del problema, mostraré el repositorio:
public interface MyRepository extends JpaRepository<MyInstance, Long> {
Optional<MyInstance> findByDate(LocalDate localDate);
}
Si paso localDate para2018-09-06
, Obtengo entidades donde la fecha es2018-09-05
(el día anterior
En los registros que veo:
2018-09-06 18:17:27.783 TRACE 13676 --- [nio-8080-exec-3] o.h.type.descriptor.sql.BasicBinder : binding parameter [1] as [DATE] - [2018-09-06]
Googleé mucho esa pregunta y encontré varios artículos con el mismo contenido (por ejemplo,https: //moelholm.com/2016/11/09/spring-boot-controlling-timezones-with-hibernate)
Entonces, tengo el siguienteapplication.yml
:
spring:
datasource:
url: jdbc:mysql://localhost:3306/MYDB?useUnicode=true&characterEncoding=utf8&useSSL=false&useLegacyDatetimeCode=false&serverTimezone=UTC
username: root
password: *****
jpa:
hibernate:
naming:
physical-strategy: org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
properties:
hibernate:
show_sql: true
use_sql_comments: true
format_sql: true
type: trace
jdbc:
time_zone: UTC
Pero no ayuda.
Utilizamos el siguiente conector:
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.12</version>
</dependency>
¿Cómo puedo resolver mi problema?
PDIntenté ejecutar ambas aplicaciones con la misma zona horaria. En este caso, todo funciona como se esperaba.
P.S.2Intenté usar la versión 6.0.6 del controlador MySQL pero no cambia nada.