java 8 開始引入了全新的時間API,但是因為JPA 2.1發布于Java 8之前,所以在JPA2.1中,Java 8 的新時間API是無法默認就被識別,正確地映射到數據庫的。
解決辦法主要有兩類: 1. 自己定義類型映射支持 2. 使用PRovider提供的擴展
以通過AttributeConverter實現java.sql.Date和java.time.LocalDate的轉換為例
@Converter(autoApply = true)public class LocalDateAttributeConverter implements AttributeConverter<LocalDate, Date> { @Override public Date convertToDatabaseColumn(LocalDate locDate) { return (locDate == null ? null : Date.valueOf(locDate)); } @Override public LocalDate convertToEntityAttribute(Date sqlDate) { return (sqlDate == null ? null : sqlDate.toLocalDate()); }}有上述Converter后,類型的轉換對于實體的使用者來說就是透明的,LocalDate與Date的轉換將會自動被應用于所有的attribute。
JPA provider自身通常會有自己的擴展方式用于支持Java 8,以 Hibernate為例(5.0及以上),利用Hibernate自身的擴展只是加入一個額外的jar包的問題。
<dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-java8</artifactId> <version>5.1.0.Final</version></dependency>這種方式不用寫任何額外的代碼即可實現對Java 8的支持,但是同時也明確的和JPA provider之間的直接依賴關系。
新聞熱點
疑難解答