Quindi sembra che la soluzione fosse impostare il fuso orario UTC per la connessione JDBC (anziché JVM):
spring.jpa.properties.hibernate.jdbc.time_zone=UTC
e si basa sull'utilizzo di Instant
per mantenere il valore lato Java e con created_at
campo con tipo DATETIME in MySQL e H2.
Il codice kotlin abbreviato risultante è:
@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)
Idee tratte dai commenti di "Joop Eggen", questo e questo articolo.
Bonus
Immagino che se stai leggendo questo, potresti anche aver bisogno di aiuto con il debug delle query SQL.
1. Per stampare le query SQL in esecuzione su H2, aggiungi TRACE_LEVEL_FILE=2
e TRACE_LEVEL_SYSTEM_OUT=2
alla stringa di connessione (vedi qui
):
spring.datasource.url=jdbc:h2:mem:dbname;TRACE_LEVEL_FILE=2;TRACE_LEVEL_SYSTEM_OUT=2;
2. Per abilitare i log di ibernazione:
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. Per abilitare i log delle query in MySQL (uno degli approcci, non utilizzare su db di produzione!):
SET GLOBAL general_log = 'ON';
SET global log_output = 'table';
select * from mysql.general_log ORDER BY event_time DESC;