Така че изглежда, че корекцията беше да се зададе UTC часова зона за JDBC връзката (вместо JVM):
spring.jpa.properties.hibernate.jdbc.time_zone=UTC
и разчита на използването на Instant
за запазване на стойността от страна на Java и с created_at
поле с тип DATETIME в MySQL и H2.
Съкратеният резултат на kotlin код е:
@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)
Идеи, взети от коментари на „Joop Eggen“, това и това статия.
Бонус
Предполагам, че ако четете това, може да се нуждаете и от помощ при отстраняване на грешки в SQL заявки.
1. За да отпечатате SQL заявки, изпълнявани на H2, добавете TRACE_LEVEL_FILE=2
и TRACE_LEVEL_SYSTEM_OUT=2
към низ за връзка (вижте тук
):
spring.datasource.url=jdbc:h2:mem:dbname;TRACE_LEVEL_FILE=2;TRACE_LEVEL_SYSTEM_OUT=2;
2. За да активирате дневниците за хибернация:
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. За да активирате регистрационните файлове на заявки в MySQL (един от подходите, не използвайте в производствена база данни!):
SET GLOBAL general_log = 'ON';
SET global log_output = 'table';
select * from mysql.general_log ORDER BY event_time DESC;