Использование LocalDateTime в JPA

Как все знают, в Java 8 появились удобные классы для работы с датами. Для реализации этого Oracle пригласил разработчика Joda Time Стивена Колборна. Историю об этом можно прочитать на сайте Oracle — http://www.oracle.com/technetwork/articles/java/jf14-date-time-2125367.html.

Сначала я тоже порадовался, что появилось такое удобное API из коробки. Но как всегда Oracle добавил свою ложку дёгтя в код.

Но Стивен, видимо, очень не любил старые классы для работы с датами в Java до версии 8. Оказалось, что использовать старые и новые API вместе практически невозможно без магических преобразований — stackoverflow бурлит вопросами о конвертации Date в LocalDate и им подобным.

Поэтому пришлось в проекте, в котором используется Date — продолжать использовать его, а в новых можно переходить на Java8.

Окей. А как насчёт работы с JPA? Вроде всё гладко кроме одного НО.

Аннотация

@Temporal

Может работать только с Date. Иначе вы будете получать ошибку:

AnnotationException @Temporal should only be set on a java.util.Date or java.util.Calendar property

Поэтому чтобы JPA начал работать с Java 8 LocalDateTime / LocalTime / LocalDate нужно скачать библиотеку hibernate-java8. Я не уверен насчёт остальных реализаций, потому что у себя всегда пользуюсь hibernate’ом.

<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-java8</artifactId>
    <version>${hibernate.version}</version>
</dependency>

После чего, для всех полей, который должны быть датой нужно прописать тип поля из этой библиотеки:

@Column
@Type(type = "org.hibernate.type.LocalDateTimeType")
private LocalDateTime lastUpdated;

И всё, после этого hibernate сможет работать с этой датой нормально

Читайте также:

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *