일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- load order
- sendFractionalSeconds
- @CreateDate
- 버전 문자열 비교
- MSSQL
- RootGraph
- NamedEntityGraph
- yml
- getDateCellValue
- getEntityGraph
- 티스토리챌린지
- deserializer
- 오블완
- spring boot
- MYSQL
- pooled-lo
- EmbeddedId
- fractional seconds
- mysql not equal null
- createEntityGraph
- 운동해서 광명찾자
- mysql equal null
- +9:00
- apatch poi
- Protecle
- 1*1000
- AuditingEntityListener
- @EntityListeners
- https
- mysql =
- Today
- Total
Hello
Hibernate 6 Timezone 관련 변경 사항 본문
NORMALIZE 와 매우 유사합니다 .
hibernate6 timezone storage 선택하는 두 가지 방법이 있고, TimeZoneStorageType enum 값을 정의합니다.
hibernate6.0, 6.1 기본값 : TimeZoneStorageType.NORMALIZE
hibernate6.2 기본값 : TimeZoneStorageType.DEFAULT
- hibernate.timezone.default_storage
- 시간대 기반 유형에 대한 스토리지를 구성하기 위한 전역 설정입니다.
spring:
jpa:
properties:
hibernate:
timezone:
default_storage: COLUMN
- @TimeZoneStorage
- 개별 속성에 대한 시간대 정보에 사용할 스토리지 정의를 지원합니다.
@TimeZoneStorage(TimeZoneStorageType.COLUMN)
@TimeZoneColumn(name = "dt_offset_zone")
private OffsetDateTime dtOffsetDateTime;
@TimeZoneStorage(TimeZoneStorageType.COLUMN)
@TimeZoneColumn(name = "ts_offset_zone")
private OffsetDateTime tsOffsetDateTime;
@TimeZoneStorage(TimeZoneStorageType.COLUMN)
@TimeZoneColumn(name = "dt_zoned_zone")
private ZonedDateTime dtZonedDateTime;
@TimeZoneStorage(TimeZoneStorageType.COLUMN)
@TimeZoneColumn(name = "ts_zoned_zone")
private ZonedDateTime tsZonedDateTime;
TimezoneStorageType
Hibernate 6.0과 6.1에서는 TimezoneStorageType의 5가지 옵션을 사용할 수 있고, Hibernate 6.2에서는 DEFAULT를 포함한 6가지 옵션을 사용할 수 있습니다.
- AUTO
- COLUMN
- NATIVE
- NORMALIZE
- NORMALIZE_UTC
AUTO
TimeZoneStorageType.AUTO 의 처리는 Hibernate의 데이터베이스 dialect에 따라 다릅니다.
이 전략은 영역 지정된 날짜 시간 유형과 오프셋 또는 시간대로 표시되는 인스턴스를 모두 보존합니다.
- 데이터베이스가 TIMESTAMP_WITH_TIMEZONE 열 유형을 지원하는 경우 NATIVE 전략을 사용합니다.
- Dialect.getTimeZoneSupport()가 NATIVE로 설정되어 있으면 TimeZoneStorageType.NATIVE 사용
- 다른 경우에는 COLUMN 전략을 사용합니다.
Dialect.columnType()을 확인하면 NATIVE일 경우에만 TIME_WITH_TIMEZONE 으로 컬럼타입을 지정해 사용하는 것을 알 수 있습니다.
COLUMN
날짜-시간(UTC) 정보와, 시간대 오프셋을 각각의 컬럼에 저장합니다. @TimeZoneColumn을 사용해 오프셋 컬럼명을 지정할 수 있습니다.
NATIVE
TIMESTAMP_WITH_TIMEZONE column type을 사용해 시간대를 저장합니다.
NORMALIZE
Hibernate 5에서 제공되는 것과 동일한 처리 및 Hibernate 6.0, 6.1의 hibernate.timezone.default_storage 의 기본값입니다.
특정 시간대로 값을 정규화합니다. hibernate.jdbc.time_zone이 설정되지 않으면 Hibernate는 JVM 기본 시간대를 사용합니다.
아래 이미지를 보면 Hibernate가 2023-01-01 12:00+02:00 의 타임스탬프를 JVM 기본 시간대(UTC+9)로 정규화하고 시간대 오프셋 제거한 2023-01-01 19:00:00을 저장하는 것을 확인 할 수 있습니다.
NORMALIZE_UTC
UTC로 정규화 합니다. NORMALIZE 와 매우 유사합니다. 데이터베이스에서 값을 검색하면 UTC로 설정됩니다.
DEFAULT(hibernate6.2이상)
Dialect.getTimeZoneSupport()가 TimeZoneSupport.NATIVE인 경우에는 TimeZoneStorageType.NATIVE로 시간대를 저장합니다. 그렇지 않으면 TimeZoneStorageType.NATIRAL_UTC로 시간대를 저장합니다.
참고:
https://thorben-janssen.com/hibernate-6-offsetdatetime-and-zoneddatetime
6.2
https://docs.jboss.org/hibernate/orm/6.2/userguide/html_single/Hibernate_User_Guide.html
6.1