Использование 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 сможет работать с этой датой нормально
Последние комменатрии