sql >> Base de Datos >  >> RDS >> Mysql

Falta de coincidencia entre los valores DATETIME en las bases de datos H2 y MySQL insertadas desde Java/Kotlin

Parece que la solución fue establecer la zona horaria UTC para la conexión JDBC (en lugar de JVM):

spring.jpa.properties.hibernate.jdbc.time_zone=UTC

y se basa en el uso de Instant por mantener el valor en el lado de Java y con created_at campo con tipo DATETIME en MySQL y H2.

El código kotlin resultante abreviado es:

@Entity
data class SomeEntity(
    val createdAt: Instant = Instant.now() // default created date is current UTC time
)

val dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd H:mm:ss")

createdAt = LocalDateTime.parse("2012-11-30 16:13:21", dateTimeFormatter).toInstant(ZoneOffset.UTC)

Ideas extraídas de comentarios de "Joop Eggen", esto y esto artículo.

Bonificación

Supongo que si estás leyendo esto, es posible que también necesites ayuda para depurar consultas SQL.

1. Para imprimir consultas SQL que se ejecutan en H2, agregue TRACE_LEVEL_FILE=2 y TRACE_LEVEL_SYSTEM_OUT=2 a la cadena de conexión (ver aquí ):

spring.datasource.url=jdbc:h2:mem:dbname;TRACE_LEVEL_FILE=2;TRACE_LEVEL_SYSTEM_OUT=2;

2. Para habilitar los registros de hibernación:

spring.jpa.properties.hibernate.show_sql=true
spring.jpa.properties.hibernate.use_sql_comments=true
spring.jpa.properties.hibernate.format_sql=true
logging.level.org.hibernate.type=TRACE

3. Para habilitar los registros de consultas en MySQL (uno de los enfoques, ¡no lo use en la base de datos de producción!):

SET GLOBAL general_log = 'ON';
SET global log_output = 'table';
select * from mysql.general_log ORDER BY event_time DESC;