Så det ser ud til, at rettelsen var at indstille UTC-tidszone for JDBC-forbindelsen (i stedet for JVM):
spring.jpa.properties.hibernate.jdbc.time_zone=UTC
og den er afhængig af at bruge Instant
for at holde værdien på Java-siden og med created_at
felt med DATETIME type i MySQL og H2.
Den forkortede resulterende kotlin-kode er:
@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)
Ideer hentet fra kommentarer fra "Joop Eggen", dette og dette artikel.
Bonus
Jeg gætter på, at hvis du læser dette, har du muligvis også brug for hjælp til fejlfinding af SQL-forespørgsler.
1. For at udskrive SQL-forespørgsler, der kører på H2, skal du tilføje TRACE_LEVEL_FILE=2
og TRACE_LEVEL_SYSTEM_OUT=2
til forbindelsesstreng (se her
):
spring.datasource.url=jdbc:h2:mem:dbname;TRACE_LEVEL_FILE=2;TRACE_LEVEL_SYSTEM_OUT=2;
2. Sådan aktiverer du dvalelogfiler:
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. For at aktivere forespørgselslogfiler i MySQL (en af fremgangsmåderne, brug ikke på produktions-db!):
SET GLOBAL general_log = 'ON';
SET global log_output = 'table';
select * from mysql.general_log ORDER BY event_time DESC;