Интеграция Java 8 DateTime API и JPA может стать достаточно нетривиальной задачей для неподготовленного разработчика. Как известно JPA вплоть до версии 2.1 (включительно) не поддерживает новый API для работы с датой и временем, который был представлен в Java 8. Это досадное ограничение можно с легкостью обойти с использованием конвертера атрибутов, не все разработчики знают об этом очень простом и крайне эффективном инструменте. Для создания своего конвертера атрибутов достаточно реализовать интерфейс AttributeConverter и переопределить два метода convertToDatabaseColumn и convertToEntityAttribute.
Рассмотрим небольшой пример:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
import java.sql.Timestamp; import java.time.LocalDateTime; import javax.persistence.AttributeConverter; import javax.persistence.Converter; @Converter(autoApply = true) public class LocalDateTimeConverter implements AttributeConverter<LocalDateTime, Timestamp>{ @Override public Timestamp convertToDatabaseColumn(LocalDateTime dateTime) { return (dateTime != null) ? Timestamp.valueOf(dateTime) : null; } @Override public LocalDateTime convertToEntityAttribute(Timestamp timestamp) { return (timestamp != null) ? timestamp.toLocalDateTime() : null; } } |
В примере происходит конвертация из Java 8 DateTime в java.sql.Timestamp, вместо Timestamp можно использовать java.util.Date.
Аннотация @Converter(autoApply = true) автоматически применяет конвертер, где это нужно.
Пример небольшого класса, где этот конвертер может использоваться:
1 2 3 4 5 6 7 8 9 10 |
import java.time.LocalDateTime; @Entity public class Shop { @Id private long id; private String name; private LocalDateTime storeTime; } |
Более подробно с Java 8 DateTime API вы можете ознакомиться пройдя по ссылке.