Có vẻ như cách khắc phục là đặt múi giờ UTC cho kết nối JDBC (thay vì JVM):
spring.jpa.properties.hibernate.jdbc.time_zone=UTC
và nó dựa vào việc sử dụng Instant
để giữ giá trị ở phía Java và với created_at
trường có kiểu DATETIME trong MySQL và H2.
Mã kotlin thu được rút gọn là:
@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)
Ý tưởng lấy từ nhận xét của "Joop Eggen", cái này và điều này bài báo.
Phần thưởng
Tôi đoán nếu bạn đang đọc nó, bạn cũng có thể cần trợ giúp để gỡ lỗi các truy vấn SQL.
1. Để in các truy vấn SQL chạy trên H2, hãy thêm TRACE_LEVEL_FILE=2
và TRACE_LEVEL_SYSTEM_OUT=2
tới chuỗi kết nối (xem tại đây
):
spring.datasource.url=jdbc:h2:mem:dbname;TRACE_LEVEL_FILE=2;TRACE_LEVEL_SYSTEM_OUT=2;
2. Để bật nhật ký ngủ đông:
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. Để bật nhật ký truy vấn trong MySQL (một trong những cách tiếp cận, không sử dụng trên db sản xuất!):
SET GLOBAL general_log = 'ON';
SET global log_output = 'table';
select * from mysql.general_log ORDER BY event_time DESC;