From 945acce07d6707dc3eaa55b650ed3aeb1d9ba078 Mon Sep 17 00:00:00 2001 From: Oliver Gierke Date: Mon, 5 Oct 2015 18:39:34 +0200 Subject: [PATCH] DATAJPA-808 - Introduced AttributeConverters for ZoneId for JSR-310 and ThreeTenBP. --- .../convert/threeten/Jsr310JpaConverters.java | 16 ++++++++++++++++ .../ThreeTenBackPortJpaConverters.java | 16 ++++++++++++++++ .../jpa/convert/threeten/DateTimeSample.java | 2 ++ .../Jsr310JpaConvertersIntegrationTests.java | 3 +++ .../jpa/convert/threetenbp/DateTimeSample.java | 2 ++ ...TenBackPortJpaConvertersIntegrationTests.java | 3 +++ 6 files changed, 42 insertions(+) diff --git a/src/main/java/org/springframework/data/jpa/convert/threeten/Jsr310JpaConverters.java b/src/main/java/org/springframework/data/jpa/convert/threeten/Jsr310JpaConverters.java index 3f61094de..f8b58985a 100644 --- a/src/main/java/org/springframework/data/jpa/convert/threeten/Jsr310JpaConverters.java +++ b/src/main/java/org/springframework/data/jpa/convert/threeten/Jsr310JpaConverters.java @@ -19,6 +19,7 @@ import java.time.Instant; import java.time.LocalDate; import java.time.LocalDateTime; import java.time.LocalTime; +import java.time.ZoneId; import java.util.Date; import javax.persistence.AttributeConverter; @@ -32,6 +33,8 @@ import org.springframework.data.convert.Jsr310Converters.InstantToDateConverter; import org.springframework.data.convert.Jsr310Converters.LocalDateTimeToDateConverter; import org.springframework.data.convert.Jsr310Converters.LocalDateToDateConverter; import org.springframework.data.convert.Jsr310Converters.LocalTimeToDateConverter; +import org.springframework.data.convert.Jsr310Converters.StringToZoneIdConverter; +import org.springframework.data.convert.Jsr310Converters.ZoneIdToStringConverter; import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean; /** @@ -99,4 +102,17 @@ public class Jsr310JpaConverters { return DateToInstantConverter.INSTANCE.convert(date); } } + + @Converter(autoApply = true) + public static class ZoneIdConverter implements AttributeConverter { + + public String convertToDatabaseColumn(ZoneId zoneId) { + return ZoneIdToStringConverter.INSTANCE.convert(zoneId); + } + + @Override + public ZoneId convertToEntityAttribute(String zoneId) { + return StringToZoneIdConverter.INSTANCE.convert(zoneId); + } + } } diff --git a/src/main/java/org/springframework/data/jpa/convert/threetenbp/ThreeTenBackPortJpaConverters.java b/src/main/java/org/springframework/data/jpa/convert/threetenbp/ThreeTenBackPortJpaConverters.java index 95ecd1dfb..141cb205f 100644 --- a/src/main/java/org/springframework/data/jpa/convert/threetenbp/ThreeTenBackPortJpaConverters.java +++ b/src/main/java/org/springframework/data/jpa/convert/threetenbp/ThreeTenBackPortJpaConverters.java @@ -28,11 +28,14 @@ import org.springframework.data.convert.ThreeTenBackPortConverters.InstantToDate import org.springframework.data.convert.ThreeTenBackPortConverters.LocalDateTimeToDateConverter; import org.springframework.data.convert.ThreeTenBackPortConverters.LocalDateToDateConverter; import org.springframework.data.convert.ThreeTenBackPortConverters.LocalTimeToDateConverter; +import org.springframework.data.convert.ThreeTenBackPortConverters.StringToZoneIdConverter; +import org.springframework.data.convert.ThreeTenBackPortConverters.ZoneIdToStringConverter; import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean; import org.threeten.bp.Instant; import org.threeten.bp.LocalDate; import org.threeten.bp.LocalDateTime; import org.threeten.bp.LocalTime; +import org.threeten.bp.ZoneId; /** * JPA 2.1 converters to turn ThreeTen back port types into legacy {@link Date}s. To activate these converters make sure @@ -101,4 +104,17 @@ public class ThreeTenBackPortJpaConverters { return DateToInstantConverter.INSTANCE.convert(date); } } + + @Converter(autoApply = true) + public static class ZoneIdConverter implements AttributeConverter { + + public String convertToDatabaseColumn(ZoneId zoneId) { + return ZoneIdToStringConverter.INSTANCE.convert(zoneId); + } + + @Override + public ZoneId convertToEntityAttribute(String zoneId) { + return StringToZoneIdConverter.INSTANCE.convert(zoneId); + } + } } diff --git a/src/test/java/org/springframework/data/jpa/convert/threeten/DateTimeSample.java b/src/test/java/org/springframework/data/jpa/convert/threeten/DateTimeSample.java index 30cfd78bd..71459d9f4 100644 --- a/src/test/java/org/springframework/data/jpa/convert/threeten/DateTimeSample.java +++ b/src/test/java/org/springframework/data/jpa/convert/threeten/DateTimeSample.java @@ -19,6 +19,7 @@ import java.time.Instant; import java.time.LocalDate; import java.time.LocalDateTime; import java.time.LocalTime; +import java.time.ZoneId; import javax.persistence.Entity; import javax.persistence.GeneratedValue; @@ -35,4 +36,5 @@ public class DateTimeSample { LocalDate localDate; LocalTime localTime; LocalDateTime localDateTime; + ZoneId zoneId; } diff --git a/src/test/java/org/springframework/data/jpa/convert/threeten/Jsr310JpaConvertersIntegrationTests.java b/src/test/java/org/springframework/data/jpa/convert/threeten/Jsr310JpaConvertersIntegrationTests.java index 88eb0c8db..bc2218471 100644 --- a/src/test/java/org/springframework/data/jpa/convert/threeten/Jsr310JpaConvertersIntegrationTests.java +++ b/src/test/java/org/springframework/data/jpa/convert/threeten/Jsr310JpaConvertersIntegrationTests.java @@ -24,6 +24,7 @@ import java.time.Instant; import java.time.LocalDate; import java.time.LocalDateTime; import java.time.LocalTime; +import java.time.ZoneId; import javax.persistence.EntityManager; import javax.persistence.PersistenceContext; @@ -68,6 +69,7 @@ public class Jsr310JpaConvertersIntegrationTests extends AbstractAttributeConver sample.localDate = LocalDate.now(); sample.localTime = LocalTime.now(); sample.localDateTime = LocalDateTime.now(); + sample.zoneId = ZoneId.of("Europe/Berlin"); em.persist(sample); em.flush(); @@ -80,5 +82,6 @@ public class Jsr310JpaConvertersIntegrationTests extends AbstractAttributeConver assertThat(result.localDate, is(sample.localDate)); assertThat(result.localTime, is(sample.localTime)); assertThat(result.localDateTime, is(sample.localDateTime)); + assertThat(result.zoneId, is(sample.zoneId)); } } diff --git a/src/test/java/org/springframework/data/jpa/convert/threetenbp/DateTimeSample.java b/src/test/java/org/springframework/data/jpa/convert/threetenbp/DateTimeSample.java index 0628cecab..d19fefcb0 100644 --- a/src/test/java/org/springframework/data/jpa/convert/threetenbp/DateTimeSample.java +++ b/src/test/java/org/springframework/data/jpa/convert/threetenbp/DateTimeSample.java @@ -23,6 +23,7 @@ import org.threeten.bp.Instant; import org.threeten.bp.LocalDate; import org.threeten.bp.LocalDateTime; import org.threeten.bp.LocalTime; +import org.threeten.bp.ZoneId; /** * @author Oliver Gierke @@ -36,4 +37,5 @@ public class DateTimeSample { LocalDate localDate; LocalTime localTime; LocalDateTime localDateTime; + ZoneId zoneId; } diff --git a/src/test/java/org/springframework/data/jpa/convert/threetenbp/ThreeTenBackPortJpaConvertersIntegrationTests.java b/src/test/java/org/springframework/data/jpa/convert/threetenbp/ThreeTenBackPortJpaConvertersIntegrationTests.java index cdfb91d3f..f09a15bd2 100644 --- a/src/test/java/org/springframework/data/jpa/convert/threetenbp/ThreeTenBackPortJpaConvertersIntegrationTests.java +++ b/src/test/java/org/springframework/data/jpa/convert/threetenbp/ThreeTenBackPortJpaConvertersIntegrationTests.java @@ -32,6 +32,7 @@ import org.threeten.bp.Instant; import org.threeten.bp.LocalDate; import org.threeten.bp.LocalDateTime; import org.threeten.bp.LocalTime; +import org.threeten.bp.ZoneId; /** * Integration tests for {@link ThreeTenBackPortJpaConverters}. @@ -68,6 +69,7 @@ public class ThreeTenBackPortJpaConvertersIntegrationTests extends AbstractAttri sample.localDate = LocalDate.now(); sample.localTime = LocalTime.now(); sample.localDateTime = LocalDateTime.now(); + sample.zoneId = ZoneId.of("Europe/Berlin"); em.persist(sample); em.flush(); @@ -80,5 +82,6 @@ public class ThreeTenBackPortJpaConvertersIntegrationTests extends AbstractAttri assertThat(result.localDate, is(sample.localDate)); assertThat(result.localTime, is(sample.localTime)); assertThat(result.localDateTime, is(sample.localDateTime)); + assertThat(result.zoneId, is(sample.zoneId)); } }