Hello

Hibernate 6 Timezone 관련 변경 사항 본문

카테고리 없음

Hibernate 6 Timezone 관련 변경 사항

nari0_0 2024. 2. 15. 11:03
728x90

NORMALIZE 와 매우 유사합니다 .

hibernate6 timezone storage 선택하는 두 가지 방법이 있고, TimeZoneStorageType enum 값을 정의합니다.

hibernate6.0, 6.1 기본값 : TimeZoneStorageType.NORMALIZE

hibernate6.2 기본값 : TimeZoneStorageType.DEFAULT

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.getTimeZoneSupport supported type

Dialect.columnType()을 확인하면 NATIVE일 경우에만 TIME_WITH_TIMEZONE 으로 컬럼타입을 지정해 사용하는 것을 알 수 있습니다.

Dialect.columnType 일부
native 동작

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을 저장하는 것을 확인 할 수 있습니다.

insert
select

NORMALIZE_UTC

UTC로 정규화 합니다. NORMALIZE 와 매우 유사합니다. 데이터베이스에서 값을 검색하면 UTC로 설정됩니다.

DEFAULT(hibernate6.2이상)

Dialect.getTimeZoneSupport()가 TimeZoneSupport.NATIVE인 경우에는 TimeZoneStorageType.NATIVE로 시간대를 저장합니다. 그렇지 않으면 TimeZoneStorageType.NATIRAL_UTC로 시간대를 저장합니다.

 

참고:

https://www.woolha.com/tutorials/hibernate-using-timezonestorage-timezonecolumn-annotations#google_vignette

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

https://docs.jboss.org/hibernate/orm//6.2/javadocs/org/hibernate/annotations/TimeZoneStorageType.html

6.1

https://docs.jboss.org/hibernate/orm//6.1/javadocs/org/hibernate/annotations/TimeZoneStorageType.html

https://docs.jboss.org/hibernate/orm/6.1/userguide/html_single/Hibernate_User_Guide.html#_timezonestorage

https://docs.jboss.org/hibernate/orm/6.1/userguide/html_single/Hibernate_User_Guide.html#_time_zone_storage

728x90