Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Incompatibilidade entre os valores DATETIME nos bancos de dados H2 e MySQL inseridos de Java/Kotlin


Parece que a correção foi definir o fuso horário UTC para a conexão JDBC (em vez de JVM):
spring.jpa.properties.hibernate.jdbc.time_zone=UTC

e depende do uso de Instant por manter o valor no lado Java e com created_at campo com tipo DATETIME no MySQL e H2.

O código kotlin resultante abreviado é:
@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)

Ideias extraídas de comentários de "Joop Eggen", this e isto artigo.

Bônus

Acho que se você está lendo isso, também pode precisar de ajuda para depurar consultas SQL.

1. Para imprimir consultas SQL em execução em H2, adicione TRACE_LEVEL_FILE=2 e TRACE_LEVEL_SYSTEM_OUT=2 para a string de conexão (consulte aqui ):
spring.datasource.url=jdbc:h2:mem:dbname;TRACE_LEVEL_FILE=2;TRACE_LEVEL_SYSTEM_OUT=2;

2. Para habilitar os logs de hibernação:
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 os logs de consulta no MySQL (uma das abordagens, não use no banco de dados de produção!):
SET GLOBAL general_log = 'ON';
SET global log_output = 'table';
select * from mysql.general_log ORDER BY event_time DESC;