하이버네이트는 기존 자바의 Date , Calendar 같은 타입을 지원해주기 위해 @Temporal 이라는 애너테이션을로 날짜 속성을 다뤘다.
그리고 Java8부터 신규 날짜 타입인 LocalDateTime , DateTime 이 추가되었음.
이에 대한 하이버네이트의 지원 히스토리는 다음과 같다.
LocalDateTime 지원 버전 히스토리Hibernate 5.0 ~ 5.1은 Java 7 기반이었기 때문에, Java 8 Date/Time API 지원을 위해 별도의 hibernate-java8 의존성 추가가 필요했습니다.
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-java8</artifactId>
<version>5.1.0.Final</version>
</dependency>
Hibernate 5.2부터는 Java 8 기반으로 전환되면서, Date/Time API 지원이 hibernate-core 모듈 자체에 포함되었습니다. 더 이상 별도 jar가 필요 없습니다.
Hibernate ORM 5.3은 JPA 2.2 표준을 구현하며, 이 스펙에서 LocalDateTime을 포함한 Java 8 타입들이 공식 JPA 표준으로 지정되었습니다.
ZonedDateTime / OffsetDateTime 처리 개선ZonedDateTime과 OffsetDateTime에 대한 타임존 처리 지원이 Hibernate 6에서 강화되었습니다. (LocalDateTime 자체의 매핑은 이미 5.x에서 완성)
| 상황 | 권장 |
|---|---|
| Hibernate < 5 | AttributeConverter 직접 구현 필요 |
| Hibernate 5.0 ~ 5.1 | hibernate-java8 의존성 추가 |
| Hibernate 5.2+ | 추가 설정 없이 바로 사용 가능 |
package net.daum.cafeadm.util;
import java.time.format.DateTimeFormatter;
import javax.persistence.AttributeConverter;
import java.time.LocalDateTime;
public class LocalDateTimeConverter implements AttributeConverter<LocalDateTime, String> {
private static final DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
@Override
public String convertToDatabaseColumn(LocalDateTime localDateTime) {
return localDateTime != null ? FORMATTER.format(localDateTime) : null;
}
@Override
public LocalDateTime convertToEntityAttribute(String string) {
return string != null ? LocalDateTime.parse(string, FORMATTER) : null;
}
}