Il semble donc que le correctif consistait à définir le fuseau horaire UTC pour la connexion JDBC (au lieu de JVM) :
spring.jpa.properties.hibernate.jdbc.time_zone=UTC
et il repose sur l'utilisation de Instant
pour conserver la valeur côté Java et avec created_at
champ de type DATETIME dans MySQL et H2.
Le code kotlin résultant raccourci est :
@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)
Idées tirées des commentaires de "Joop Eggen", ceci et ceci article.
Bonus
Je suppose que si vous lisez ceci, vous pourriez également avoir besoin d'aide pour le débogage des requêtes SQL.
1. Pour imprimer les requêtes SQL exécutées sur H2, ajoutez TRACE_LEVEL_FILE=2
et TRACE_LEVEL_SYSTEM_OUT=2
à la chaîne de connexion (voir ici
):
spring.datasource.url=jdbc:h2:mem:dbname;TRACE_LEVEL_FILE=2;TRACE_LEVEL_SYSTEM_OUT=2;
2. Pour activer les journaux d'hibernation :
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. Pour activer les journaux de requêtes dans MySQL (l'une des approches, ne pas utiliser sur la base de données de production !) :
SET GLOBAL general_log = 'ON';
SET global log_output = 'table';
select * from mysql.general_log ORDER BY event_time DESC;