From 5fe3d3b7102abd5e3b63694b45a6c16125cc269e Mon Sep 17 00:00:00 2001 From: Vlad Mihalcea Date: Fri, 9 Jun 2023 16:22:14 +0300 Subject: [PATCH] Implement EnhancedUserType in a new DescriptorImmutableType in Hibernate 6 modules #633 --- .../type/DescriptorImmutableType.java | 73 ++++++++++++++++++ .../ImmutableDynamicParameterizedType.java | 14 +++- .../utils/hibernate/type/ImmutableType.java | 15 +++- .../utils/hibernate/type/MutableType.java | 18 ++--- .../type/basic/Iso8601MonthType.java | 10 ++- .../type/basic/MonthDayDateType.java | 10 ++- .../type/basic/MonthDayIntegerType.java | 10 ++- .../type/basic/NullableCharacterType.java | 6 ++ .../type/basic/PostgreSQLCITextType.java | 6 ++ .../type/basic/PostgreSQLEnumType.java | 7 ++ .../type/basic/PostgreSQLHStoreType.java | 16 ++++ .../type/basic/PostgreSQLInetType.java | 7 ++ .../type/basic/PostgreSQLLTreeType.java | 7 +- .../type/basic/YearMonthDateType.java | 10 ++- .../type/basic/YearMonthEpochType.java | 10 ++- .../type/basic/YearMonthIntegerType.java | 10 ++- .../type/basic/YearMonthTimestampType.java | 10 ++- .../utils/hibernate/type/basic/YearType.java | 11 ++- .../hibernate/type/basic/ZoneIdType.java | 11 ++- .../Iso8601MonthMonthTypeDescriptor.java | 3 +- .../OracleIntervalDayToSecondType.java | 4 + .../type/interval/PostgreSQLIntervalType.java | 5 ++ .../type/interval/PostgreSQLPeriodType.java | 5 ++ .../type/money/CurrencyUnitType.java | 10 ++- .../type/range/PostgreSQLRangeType.java | 39 ++++++++++ .../range/guava/PostgreSQLGuavaRangeType.java | 47 ++++++++++-- .../type/basic/PostgreSQLYearMonthIdTest.java | 75 ++++++++++++++++++ .../type/DescriptorImmutableType.java | 73 ++++++++++++++++++ .../ImmutableDynamicParameterizedType.java | 14 +++- .../utils/hibernate/type/ImmutableType.java | 13 +++- .../utils/hibernate/type/MutableType.java | 24 +++--- .../type/basic/Iso8601MonthType.java | 10 ++- .../type/basic/MonthDayDateType.java | 10 ++- .../type/basic/MonthDayIntegerType.java | 10 ++- .../type/basic/NullableCharacterType.java | 6 ++ .../type/basic/PostgreSQLCITextType.java | 6 ++ .../type/basic/PostgreSQLEnumType.java | 6 ++ .../type/basic/PostgreSQLHStoreType.java | 16 ++++ .../type/basic/PostgreSQLInetType.java | 7 ++ .../type/basic/PostgreSQLLTreeType.java | 6 ++ .../type/basic/YearMonthDateType.java | 10 ++- .../type/basic/YearMonthEpochType.java | 10 ++- .../type/basic/YearMonthIntegerType.java | 15 ++-- .../type/basic/YearMonthTimestampType.java | 10 ++- .../utils/hibernate/type/basic/YearType.java | 11 ++- .../hibernate/type/basic/ZoneIdType.java | 11 ++- .../Iso8601MonthMonthTypeDescriptor.java | 3 +- .../OracleIntervalDayToSecondType.java | 4 + .../type/interval/PostgreSQLIntervalType.java | 5 ++ .../type/interval/PostgreSQLPeriodType.java | 5 ++ .../type/json/JsonNodeStringType.java | 1 - .../hibernate/type/json/JsonStringType.java | 1 - .../utils/hibernate/type/json/JsonType.java | 1 - .../type/money/CurrencyUnitType.java | 10 ++- .../type/range/PostgreSQLRangeType.java | 39 ++++++++++ .../utils/hibernate/type/range/Range.java | 6 +- .../range/guava/PostgreSQLGuavaRangeType.java | 47 ++++++++++-- .../basic/PostgreSQLYearMonthEpochTest.java | 41 +++++----- .../type/basic/PostgreSQLYearMonthIdTest.java | 76 +++++++++++++++++++ 59 files changed, 840 insertions(+), 116 deletions(-) create mode 100644 hypersistence-utils-hibernate-60/src/main/java/io/hypersistence/utils/hibernate/type/DescriptorImmutableType.java create mode 100644 hypersistence-utils-hibernate-60/src/test/java/io/hypersistence/utils/hibernate/type/basic/PostgreSQLYearMonthIdTest.java create mode 100644 hypersistence-utils-hibernate-62/src/main/java/io/hypersistence/utils/hibernate/type/DescriptorImmutableType.java create mode 100644 hypersistence-utils-hibernate-62/src/test/java/io/hypersistence/utils/hibernate/type/basic/PostgreSQLYearMonthIdTest.java diff --git a/hypersistence-utils-hibernate-60/src/main/java/io/hypersistence/utils/hibernate/type/DescriptorImmutableType.java b/hypersistence-utils-hibernate-60/src/main/java/io/hypersistence/utils/hibernate/type/DescriptorImmutableType.java new file mode 100644 index 000000000..e466abed6 --- /dev/null +++ b/hypersistence-utils-hibernate-60/src/main/java/io/hypersistence/utils/hibernate/type/DescriptorImmutableType.java @@ -0,0 +1,73 @@ +package io.hypersistence.utils.hibernate.type; + +import io.hypersistence.utils.hibernate.type.util.Configuration; +import org.hibernate.HibernateException; +import org.hibernate.engine.spi.SharedSessionContractImplementor; +import org.hibernate.query.BindableType; +import org.hibernate.query.sqm.SqmExpressible; +import org.hibernate.type.descriptor.java.JavaType; +import org.hibernate.type.descriptor.jdbc.JdbcType; +import org.hibernate.usertype.UserType; + +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; + +/** + * Very convenient base class for implementing immutable object types using Hibernate {@link UserType} using the {@link JdbcType} and {@link JavaType} descriptors. + * + * @author Vlad Mihalcea + */ +public abstract class DescriptorImmutableType> extends ImmutableType implements BindableType, SqmExpressible { + + private final JDBC jdbcTypeDescriptor; + private final JAVA javaTypeDescriptor; + + public DescriptorImmutableType(Class clazz, JDBC jdbcTypeDescriptor, JAVA javaTypeDescriptor) { + super(clazz); + this.jdbcTypeDescriptor = jdbcTypeDescriptor; + this.javaTypeDescriptor = javaTypeDescriptor; + } + + public DescriptorImmutableType(Class clazz, JDBC jdbcTypeDescriptor, JAVA javaTypeDescriptor, Configuration configuration) { + super(clazz, configuration); + this.jdbcTypeDescriptor = jdbcTypeDescriptor; + this.javaTypeDescriptor = javaTypeDescriptor; + } + + @Override + public T nullSafeGet(ResultSet rs, int position, SharedSessionContractImplementor session, Object owner) throws + SQLException { + return jdbcTypeDescriptor.getExtractor(javaTypeDescriptor).extract(rs, position, session); + } + + @Override + public void nullSafeSet(PreparedStatement st, Object value, int index, SharedSessionContractImplementor session) throws HibernateException, SQLException { + jdbcTypeDescriptor.getBinder(javaTypeDescriptor).bind(st, (T) value, index, session); + } + + @Override + protected T get(ResultSet rs, int position, SharedSessionContractImplementor session, Object owner) throws SQLException { + return nullSafeGet(rs, position, session, owner); + } + + @Override + protected void set(PreparedStatement st, T value, int index, SharedSessionContractImplementor session) throws SQLException { + nullSafeSet(st, value, index, session); + } + + @Override + public int getSqlType() { + return jdbcTypeDescriptor.getJdbcTypeCode(); + } + + @Override + public Class getBindableJavaType() { + return returnedClass(); + } + + @Override + public JavaType getExpressibleJavaType() { + return javaTypeDescriptor; + } +} diff --git a/hypersistence-utils-hibernate-60/src/main/java/io/hypersistence/utils/hibernate/type/ImmutableDynamicParameterizedType.java b/hypersistence-utils-hibernate-60/src/main/java/io/hypersistence/utils/hibernate/type/ImmutableDynamicParameterizedType.java index abb852c5c..41ce6ee4f 100644 --- a/hypersistence-utils-hibernate-60/src/main/java/io/hypersistence/utils/hibernate/type/ImmutableDynamicParameterizedType.java +++ b/hypersistence-utils-hibernate-60/src/main/java/io/hypersistence/utils/hibernate/type/ImmutableDynamicParameterizedType.java @@ -1,12 +1,14 @@ package io.hypersistence.utils.hibernate.type; import io.hypersistence.utils.hibernate.type.util.Configuration; +import org.hibernate.HibernateException; import org.hibernate.usertype.DynamicParameterizedType; +import org.hibernate.usertype.EnhancedUserType; /** * @author Vlad Mihalcea */ -public abstract class ImmutableDynamicParameterizedType extends ImmutableType implements DynamicParameterizedType { +public abstract class ImmutableDynamicParameterizedType extends ImmutableType implements DynamicParameterizedType, EnhancedUserType { /** * {@inheritDoc} @@ -21,4 +23,14 @@ public ImmutableDynamicParameterizedType(Class clazz) { public ImmutableDynamicParameterizedType(Class clazz, Configuration configuration) { super(clazz, configuration); } + + @Override + public String toSqlLiteral(T o) { + return toString(o); + } + + @Override + public String toString(T o) throws HibernateException { + return o != null ? o.toString() : null; + } } \ No newline at end of file diff --git a/hypersistence-utils-hibernate-60/src/main/java/io/hypersistence/utils/hibernate/type/ImmutableType.java b/hypersistence-utils-hibernate-60/src/main/java/io/hypersistence/utils/hibernate/type/ImmutableType.java index bacad3850..1c94dcd56 100644 --- a/hypersistence-utils-hibernate-60/src/main/java/io/hypersistence/utils/hibernate/type/ImmutableType.java +++ b/hypersistence-utils-hibernate-60/src/main/java/io/hypersistence/utils/hibernate/type/ImmutableType.java @@ -11,6 +11,7 @@ import org.hibernate.type.ForeignKeyDirection; import org.hibernate.type.Type; import org.hibernate.type.descriptor.java.IncomparableComparator; +import org.hibernate.usertype.EnhancedUserType; import org.hibernate.usertype.UserType; import java.io.Serializable; @@ -28,7 +29,7 @@ * * @author Vlad Mihalcea */ -public abstract class ImmutableType implements UserType, Type { +public abstract class ImmutableType implements UserType, Type, EnhancedUserType { private final Configuration configuration; @@ -283,4 +284,14 @@ public boolean[] toColumnNullness(Object value, Mapping mapping) { public int[] getSqlTypeCodes(Mapping mapping) throws MappingException { return new int[]{getSqlType()}; } -} \ No newline at end of file + + @Override + public String toSqlLiteral(T o) { + return toString(o); + } + + @Override + public String toString(T o) throws HibernateException { + return o != null ? o.toString() : null; + } +} diff --git a/hypersistence-utils-hibernate-60/src/main/java/io/hypersistence/utils/hibernate/type/MutableType.java b/hypersistence-utils-hibernate-60/src/main/java/io/hypersistence/utils/hibernate/type/MutableType.java index 42e1e8ebc..c9c4d63e2 100644 --- a/hypersistence-utils-hibernate-60/src/main/java/io/hypersistence/utils/hibernate/type/MutableType.java +++ b/hypersistence-utils-hibernate-60/src/main/java/io/hypersistence/utils/hibernate/type/MutableType.java @@ -29,7 +29,7 @@ */ public abstract class MutableType> implements UserType, BindableType, SqmExpressible, BasicValuedMapping { - private final Class returnedClass; + private final Class clazz; private final JDBC jdbcTypeDescriptor; private final JAVA javaTypeDescriptor; @@ -41,25 +41,25 @@ public abstract class MutableType returnedClass, JDBC jdbcTypeDescriptor, JAVA javaTypeDescriptor) { - this(returnedClass, jdbcTypeDescriptor, javaTypeDescriptor, Configuration.INSTANCE); + public MutableType(Class clazz, JDBC jdbcTypeDescriptor, JAVA javaTypeDescriptor) { + this(clazz, jdbcTypeDescriptor, javaTypeDescriptor, Configuration.INSTANCE); } /** * Initialization constructor taking the {@link Class} * and using the provided {@link Configuration} object. * - * @param returnedClass The class returned by {@link UserType#nullSafeGet(ResultSet, int, SharedSessionContractImplementor, Object)}. + * @param clazz The class returned by {@link UserType#nullSafeGet(ResultSet, int, SharedSessionContractImplementor, Object)}. * @param jdbcTypeDescriptor the JDBC type descriptor * @param javaTypeDescriptor the Java type descriptor * @param configuration the configuration */ - public MutableType(Class returnedClass, JDBC jdbcTypeDescriptor, JAVA javaTypeDescriptor, Configuration configuration) { - this.returnedClass = returnedClass; + public MutableType(Class clazz, JDBC jdbcTypeDescriptor, JAVA javaTypeDescriptor, Configuration configuration) { + this.clazz = clazz; this.jdbcTypeDescriptor = jdbcTypeDescriptor; this.javaTypeDescriptor = javaTypeDescriptor; this.configuration = configuration; @@ -137,12 +137,12 @@ public int getSqlType() { @Override public Class returnedClass() { - return returnedClass; + return clazz; } @Override public Class getBindableJavaType() { - return returnedClass; + return clazz; } @Override diff --git a/hypersistence-utils-hibernate-60/src/main/java/io/hypersistence/utils/hibernate/type/basic/Iso8601MonthType.java b/hypersistence-utils-hibernate-60/src/main/java/io/hypersistence/utils/hibernate/type/basic/Iso8601MonthType.java index dc8e6835d..513edd3b0 100644 --- a/hypersistence-utils-hibernate-60/src/main/java/io/hypersistence/utils/hibernate/type/basic/Iso8601MonthType.java +++ b/hypersistence-utils-hibernate-60/src/main/java/io/hypersistence/utils/hibernate/type/basic/Iso8601MonthType.java @@ -1,8 +1,9 @@ package io.hypersistence.utils.hibernate.type.basic; -import io.hypersistence.utils.hibernate.type.MutableType; +import io.hypersistence.utils.hibernate.type.DescriptorImmutableType; import io.hypersistence.utils.hibernate.type.basic.internal.Iso8601MonthMonthTypeDescriptor; import io.hypersistence.utils.hibernate.type.util.Configuration; +import org.hibernate.HibernateException; import org.hibernate.type.descriptor.jdbc.IntegerJdbcType; import java.time.Month; @@ -14,7 +15,7 @@ * * @author Martin Panzer */ -public class Iso8601MonthType extends MutableType { +public class Iso8601MonthType extends DescriptorImmutableType { public static final Iso8601MonthType INSTANCE = new Iso8601MonthType(); @@ -42,4 +43,9 @@ public Iso8601MonthType(org.hibernate.type.spi.TypeBootstrapContext typeBootstra public String getName() { return "month"; } + + @Override + public Month fromStringValue(CharSequence sequence) throws HibernateException { + return sequence != null ? Month.valueOf((String) sequence) : null; + } } \ No newline at end of file diff --git a/hypersistence-utils-hibernate-60/src/main/java/io/hypersistence/utils/hibernate/type/basic/MonthDayDateType.java b/hypersistence-utils-hibernate-60/src/main/java/io/hypersistence/utils/hibernate/type/basic/MonthDayDateType.java index ba8298c09..c028bb59d 100644 --- a/hypersistence-utils-hibernate-60/src/main/java/io/hypersistence/utils/hibernate/type/basic/MonthDayDateType.java +++ b/hypersistence-utils-hibernate-60/src/main/java/io/hypersistence/utils/hibernate/type/basic/MonthDayDateType.java @@ -1,10 +1,13 @@ package io.hypersistence.utils.hibernate.type.basic; +import io.hypersistence.utils.hibernate.type.DescriptorImmutableType; import io.hypersistence.utils.hibernate.type.MutableType; import io.hypersistence.utils.hibernate.type.basic.internal.MonthDayTypeDescriptor; import io.hypersistence.utils.hibernate.type.util.Configuration; +import org.hibernate.HibernateException; import org.hibernate.type.descriptor.jdbc.DateJdbcType; +import java.time.Month; import java.time.MonthDay; /** @@ -13,7 +16,7 @@ * @author Mladen Savic (mladensavic94@gmail.com) */ -public class MonthDayDateType extends MutableType { +public class MonthDayDateType extends DescriptorImmutableType { public static final MonthDayDateType INSTANCE = new MonthDayDateType(); @@ -32,4 +35,9 @@ public MonthDayDateType(org.hibernate.type.spi.TypeBootstrapContext typeBootstra public String getName() { return "monthday-date"; } + + @Override + public MonthDay fromStringValue(CharSequence sequence) throws HibernateException { + return sequence != null ? MonthDay.parse(sequence) : null; + } } diff --git a/hypersistence-utils-hibernate-60/src/main/java/io/hypersistence/utils/hibernate/type/basic/MonthDayIntegerType.java b/hypersistence-utils-hibernate-60/src/main/java/io/hypersistence/utils/hibernate/type/basic/MonthDayIntegerType.java index 4dd84ea28..ebab78f25 100644 --- a/hypersistence-utils-hibernate-60/src/main/java/io/hypersistence/utils/hibernate/type/basic/MonthDayIntegerType.java +++ b/hypersistence-utils-hibernate-60/src/main/java/io/hypersistence/utils/hibernate/type/basic/MonthDayIntegerType.java @@ -1,8 +1,9 @@ package io.hypersistence.utils.hibernate.type.basic; -import io.hypersistence.utils.hibernate.type.MutableType; +import io.hypersistence.utils.hibernate.type.DescriptorImmutableType; import io.hypersistence.utils.hibernate.type.basic.internal.MonthDayTypeDescriptor; import io.hypersistence.utils.hibernate.type.util.Configuration; +import org.hibernate.HibernateException; import org.hibernate.type.descriptor.jdbc.IntegerJdbcType; import java.time.MonthDay; @@ -12,7 +13,7 @@ * * @author Mladen Savic (mladensavic94@gmail.com) */ -public class MonthDayIntegerType extends MutableType { +public class MonthDayIntegerType extends DescriptorImmutableType { public static final MonthDayIntegerType INSTANCE = new MonthDayIntegerType(); @@ -40,4 +41,9 @@ public MonthDayIntegerType(org.hibernate.type.spi.TypeBootstrapContext typeBoots public String getName() { return "monthday-int"; } + + @Override + public MonthDay fromStringValue(CharSequence sequence) throws HibernateException { + return sequence != null ? MonthDay.parse(sequence) : null; + } } diff --git a/hypersistence-utils-hibernate-60/src/main/java/io/hypersistence/utils/hibernate/type/basic/NullableCharacterType.java b/hypersistence-utils-hibernate-60/src/main/java/io/hypersistence/utils/hibernate/type/basic/NullableCharacterType.java index 0e94b5ea1..8711d3f84 100644 --- a/hypersistence-utils-hibernate-60/src/main/java/io/hypersistence/utils/hibernate/type/basic/NullableCharacterType.java +++ b/hypersistence-utils-hibernate-60/src/main/java/io/hypersistence/utils/hibernate/type/basic/NullableCharacterType.java @@ -2,6 +2,7 @@ import io.hypersistence.utils.hibernate.type.ImmutableType; import io.hypersistence.utils.hibernate.type.util.Configuration; +import org.hibernate.HibernateException; import org.hibernate.engine.spi.SharedSessionContractImplementor; import java.sql.PreparedStatement; @@ -49,4 +50,9 @@ public void set(PreparedStatement st, Character value, int index, st.setString(index, String.valueOf(value)); } } + + @Override + public Character fromStringValue(CharSequence sequence) throws HibernateException { + return sequence != null ? sequence.charAt(0) : null; + } } \ No newline at end of file diff --git a/hypersistence-utils-hibernate-60/src/main/java/io/hypersistence/utils/hibernate/type/basic/PostgreSQLCITextType.java b/hypersistence-utils-hibernate-60/src/main/java/io/hypersistence/utils/hibernate/type/basic/PostgreSQLCITextType.java index ae4b638ca..7b717ce65 100644 --- a/hypersistence-utils-hibernate-60/src/main/java/io/hypersistence/utils/hibernate/type/basic/PostgreSQLCITextType.java +++ b/hypersistence-utils-hibernate-60/src/main/java/io/hypersistence/utils/hibernate/type/basic/PostgreSQLCITextType.java @@ -2,6 +2,7 @@ import io.hypersistence.utils.hibernate.type.ImmutableType; import io.hypersistence.utils.hibernate.type.util.Configuration; +import org.hibernate.HibernateException; import org.hibernate.engine.spi.SharedSessionContractImplementor; import java.sql.PreparedStatement; @@ -42,4 +43,9 @@ protected String get(ResultSet rs, int position, SharedSessionContractImplemento protected void set(PreparedStatement st, String value, int index, SharedSessionContractImplementor session) throws SQLException { st.setObject(index, value, Types.OTHER); } + + @Override + public String fromStringValue(CharSequence sequence) throws HibernateException { + return (String) sequence; + } } diff --git a/hypersistence-utils-hibernate-60/src/main/java/io/hypersistence/utils/hibernate/type/basic/PostgreSQLEnumType.java b/hypersistence-utils-hibernate-60/src/main/java/io/hypersistence/utils/hibernate/type/basic/PostgreSQLEnumType.java index 3c5137ebe..4893caeb4 100644 --- a/hypersistence-utils-hibernate-60/src/main/java/io/hypersistence/utils/hibernate/type/basic/PostgreSQLEnumType.java +++ b/hypersistence-utils-hibernate-60/src/main/java/io/hypersistence/utils/hibernate/type/basic/PostgreSQLEnumType.java @@ -2,6 +2,7 @@ import io.hypersistence.utils.hibernate.type.ImmutableDynamicParameterizedType; import io.hypersistence.utils.hibernate.util.ReflectionUtils; +import org.hibernate.HibernateException; import org.hibernate.engine.spi.SharedSessionContractImplementor; import org.hibernate.metamodel.model.convert.spi.EnumValueConverter; import org.hibernate.type.EnumType; @@ -12,6 +13,7 @@ import org.hibernate.type.descriptor.jdbc.JdbcType; import org.hibernate.type.descriptor.jdbc.ObjectJdbcType; import org.hibernate.type.spi.TypeConfiguration; +import org.hibernate.usertype.DynamicParameterizedType; import java.sql.PreparedStatement; import java.sql.ResultSet; @@ -85,4 +87,9 @@ public Class returnedClass() { public int getSqlType() { return Types.OTHER; } + + @Override + public Enum fromStringValue(CharSequence charSequence) throws HibernateException { + return charSequence != null ? Enum.valueOf(enumType.returnedClass(), (String) charSequence) : null; + } } diff --git a/hypersistence-utils-hibernate-60/src/main/java/io/hypersistence/utils/hibernate/type/basic/PostgreSQLHStoreType.java b/hypersistence-utils-hibernate-60/src/main/java/io/hypersistence/utils/hibernate/type/basic/PostgreSQLHStoreType.java index f313376f1..137c2b282 100644 --- a/hypersistence-utils-hibernate-60/src/main/java/io/hypersistence/utils/hibernate/type/basic/PostgreSQLHStoreType.java +++ b/hypersistence-utils-hibernate-60/src/main/java/io/hypersistence/utils/hibernate/type/basic/PostgreSQLHStoreType.java @@ -1,7 +1,9 @@ package io.hypersistence.utils.hibernate.type.basic; import io.hypersistence.utils.hibernate.type.ImmutableType; +import io.hypersistence.utils.hibernate.type.json.internal.JacksonUtil; import io.hypersistence.utils.hibernate.type.util.Configuration; +import org.hibernate.HibernateException; import org.hibernate.engine.spi.SharedSessionContractImplementor; import java.sql.PreparedStatement; @@ -47,4 +49,18 @@ protected Map get(ResultSet rs, int position, SharedSessionContractImplementor s protected void set(PreparedStatement st, Map value, int index, SharedSessionContractImplementor session) throws SQLException { st.setObject(index, value); } + + @Override + public Map fromStringValue(CharSequence sequence) throws HibernateException { + try { + return JacksonUtil.fromString((String) sequence, Map.class); + } catch (Exception e) { + throw new IllegalArgumentException( + String.format( + "Could not transform the [%s] value to a Map!", + sequence + ) + ); + } + } } diff --git a/hypersistence-utils-hibernate-60/src/main/java/io/hypersistence/utils/hibernate/type/basic/PostgreSQLInetType.java b/hypersistence-utils-hibernate-60/src/main/java/io/hypersistence/utils/hibernate/type/basic/PostgreSQLInetType.java index 448d6c620..020e43d93 100644 --- a/hypersistence-utils-hibernate-60/src/main/java/io/hypersistence/utils/hibernate/type/basic/PostgreSQLInetType.java +++ b/hypersistence-utils-hibernate-60/src/main/java/io/hypersistence/utils/hibernate/type/basic/PostgreSQLInetType.java @@ -3,12 +3,14 @@ import io.hypersistence.utils.hibernate.type.ImmutableType; import io.hypersistence.utils.hibernate.type.util.Configuration; import io.hypersistence.utils.hibernate.util.ReflectionUtils; +import org.hibernate.HibernateException; import org.hibernate.engine.spi.SharedSessionContractImplementor; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Types; +import java.util.Map; /** * Maps an {@link Inet} object type to a PostgreSQL INET column type. @@ -53,4 +55,9 @@ public void set(PreparedStatement st, Inet value, int index, SharedSessionContra st.setObject(index, holder); } } + + @Override + public Inet fromStringValue(CharSequence sequence) throws HibernateException { + return sequence != null ? new Inet((String) sequence): null; + } } \ No newline at end of file diff --git a/hypersistence-utils-hibernate-60/src/main/java/io/hypersistence/utils/hibernate/type/basic/PostgreSQLLTreeType.java b/hypersistence-utils-hibernate-60/src/main/java/io/hypersistence/utils/hibernate/type/basic/PostgreSQLLTreeType.java index 4a503febf..b4cf5dff3 100644 --- a/hypersistence-utils-hibernate-60/src/main/java/io/hypersistence/utils/hibernate/type/basic/PostgreSQLLTreeType.java +++ b/hypersistence-utils-hibernate-60/src/main/java/io/hypersistence/utils/hibernate/type/basic/PostgreSQLLTreeType.java @@ -2,13 +2,13 @@ import io.hypersistence.utils.hibernate.type.ImmutableType; import io.hypersistence.utils.hibernate.type.util.Configuration; +import org.hibernate.HibernateException; import org.hibernate.engine.spi.SharedSessionContractImplementor; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Types; -import java.util.Map; /** * Maps a {@link String} object type to a PostgreSQL ltree @@ -44,4 +44,9 @@ protected String get(ResultSet rs, int position, SharedSessionContractImplemento protected void set(PreparedStatement st, String value, int index, SharedSessionContractImplementor session) throws SQLException { st.setObject(index, value, Types.OTHER); } + + @Override + public String fromStringValue(CharSequence sequence) throws HibernateException { + return (String) sequence; + } } diff --git a/hypersistence-utils-hibernate-60/src/main/java/io/hypersistence/utils/hibernate/type/basic/YearMonthDateType.java b/hypersistence-utils-hibernate-60/src/main/java/io/hypersistence/utils/hibernate/type/basic/YearMonthDateType.java index d2dc711b1..cf0c4b5a3 100644 --- a/hypersistence-utils-hibernate-60/src/main/java/io/hypersistence/utils/hibernate/type/basic/YearMonthDateType.java +++ b/hypersistence-utils-hibernate-60/src/main/java/io/hypersistence/utils/hibernate/type/basic/YearMonthDateType.java @@ -1,8 +1,9 @@ package io.hypersistence.utils.hibernate.type.basic; -import io.hypersistence.utils.hibernate.type.MutableType; +import io.hypersistence.utils.hibernate.type.DescriptorImmutableType; import io.hypersistence.utils.hibernate.type.basic.internal.YearMonthTypeDescriptor; import io.hypersistence.utils.hibernate.type.util.Configuration; +import org.hibernate.HibernateException; import org.hibernate.type.descriptor.jdbc.DateJdbcType; import java.time.YearMonth; @@ -14,7 +15,7 @@ * * @author Vlad Mihalcea */ -public class YearMonthDateType extends MutableType { +public class YearMonthDateType extends DescriptorImmutableType { public static final YearMonthDateType INSTANCE = new YearMonthDateType(); @@ -42,4 +43,9 @@ public YearMonthDateType(org.hibernate.type.spi.TypeBootstrapContext typeBootstr public String getName() { return "yearmonth-date"; } + + @Override + public YearMonth fromStringValue(CharSequence charSequence) throws HibernateException { + return charSequence != null ? YearMonth.parse(charSequence) : null; + } } \ No newline at end of file diff --git a/hypersistence-utils-hibernate-60/src/main/java/io/hypersistence/utils/hibernate/type/basic/YearMonthEpochType.java b/hypersistence-utils-hibernate-60/src/main/java/io/hypersistence/utils/hibernate/type/basic/YearMonthEpochType.java index 515d0414b..82d4e2246 100644 --- a/hypersistence-utils-hibernate-60/src/main/java/io/hypersistence/utils/hibernate/type/basic/YearMonthEpochType.java +++ b/hypersistence-utils-hibernate-60/src/main/java/io/hypersistence/utils/hibernate/type/basic/YearMonthEpochType.java @@ -1,8 +1,9 @@ package io.hypersistence.utils.hibernate.type.basic; -import io.hypersistence.utils.hibernate.type.MutableType; +import io.hypersistence.utils.hibernate.type.DescriptorImmutableType; import io.hypersistence.utils.hibernate.type.basic.internal.YearMonthEpochTypeDescriptor; import io.hypersistence.utils.hibernate.type.util.Configuration; +import org.hibernate.HibernateException; import org.hibernate.type.descriptor.jdbc.SmallIntJdbcType; import java.time.YearMonth; @@ -13,7 +14,7 @@ * * @author Vlad Mihalcea */ -public class YearMonthEpochType extends MutableType { +public class YearMonthEpochType extends DescriptorImmutableType { public static final YearMonthEpochType INSTANCE = new YearMonthEpochType(); @@ -41,4 +42,9 @@ public YearMonthEpochType(org.hibernate.type.spi.TypeBootstrapContext typeBootst public String getName() { return "yearmonth-epoch"; } + + @Override + public YearMonth fromStringValue(CharSequence charSequence) throws HibernateException { + return charSequence != null ? YearMonth.parse(charSequence) : null; + } } \ No newline at end of file diff --git a/hypersistence-utils-hibernate-60/src/main/java/io/hypersistence/utils/hibernate/type/basic/YearMonthIntegerType.java b/hypersistence-utils-hibernate-60/src/main/java/io/hypersistence/utils/hibernate/type/basic/YearMonthIntegerType.java index c947f4f68..a51529a09 100644 --- a/hypersistence-utils-hibernate-60/src/main/java/io/hypersistence/utils/hibernate/type/basic/YearMonthIntegerType.java +++ b/hypersistence-utils-hibernate-60/src/main/java/io/hypersistence/utils/hibernate/type/basic/YearMonthIntegerType.java @@ -1,8 +1,9 @@ package io.hypersistence.utils.hibernate.type.basic; -import io.hypersistence.utils.hibernate.type.MutableType; +import io.hypersistence.utils.hibernate.type.DescriptorImmutableType; import io.hypersistence.utils.hibernate.type.basic.internal.YearMonthTypeDescriptor; import io.hypersistence.utils.hibernate.type.util.Configuration; +import org.hibernate.HibernateException; import org.hibernate.type.descriptor.jdbc.IntegerJdbcType; import java.time.YearMonth; @@ -14,7 +15,7 @@ * * @author Vlad Mihalcea */ -public class YearMonthIntegerType extends MutableType { +public class YearMonthIntegerType extends DescriptorImmutableType { public static final YearMonthIntegerType INSTANCE = new YearMonthIntegerType(); @@ -42,4 +43,9 @@ public YearMonthIntegerType(org.hibernate.type.spi.TypeBootstrapContext typeBoot public String getName() { return "yearmonth-int"; } + + @Override + public YearMonth fromStringValue(CharSequence charSequence) throws HibernateException { + return charSequence != null ? YearMonth.parse(charSequence) : null; + } } \ No newline at end of file diff --git a/hypersistence-utils-hibernate-60/src/main/java/io/hypersistence/utils/hibernate/type/basic/YearMonthTimestampType.java b/hypersistence-utils-hibernate-60/src/main/java/io/hypersistence/utils/hibernate/type/basic/YearMonthTimestampType.java index 9ad91ce84..d8cc08146 100644 --- a/hypersistence-utils-hibernate-60/src/main/java/io/hypersistence/utils/hibernate/type/basic/YearMonthTimestampType.java +++ b/hypersistence-utils-hibernate-60/src/main/java/io/hypersistence/utils/hibernate/type/basic/YearMonthTimestampType.java @@ -1,8 +1,9 @@ package io.hypersistence.utils.hibernate.type.basic; -import io.hypersistence.utils.hibernate.type.MutableType; +import io.hypersistence.utils.hibernate.type.DescriptorImmutableType; import io.hypersistence.utils.hibernate.type.basic.internal.YearMonthTypeDescriptor; import io.hypersistence.utils.hibernate.type.util.Configuration; +import org.hibernate.HibernateException; import org.hibernate.type.descriptor.jdbc.TimestampJdbcType; import java.time.YearMonth; @@ -13,7 +14,7 @@ * * @author Vlad Mihalcea */ -public class YearMonthTimestampType extends MutableType { +public class YearMonthTimestampType extends DescriptorImmutableType { public static final YearMonthTimestampType INSTANCE = new YearMonthTimestampType(); @@ -41,4 +42,9 @@ public YearMonthTimestampType(org.hibernate.type.spi.TypeBootstrapContext typeBo public String getName() { return "yearmonth-timestamp"; } + + @Override + public YearMonth fromStringValue(CharSequence charSequence) throws HibernateException { + return charSequence != null ? YearMonth.parse(charSequence) : null; + } } \ No newline at end of file diff --git a/hypersistence-utils-hibernate-60/src/main/java/io/hypersistence/utils/hibernate/type/basic/YearType.java b/hypersistence-utils-hibernate-60/src/main/java/io/hypersistence/utils/hibernate/type/basic/YearType.java index 9dcbba206..1624d9078 100644 --- a/hypersistence-utils-hibernate-60/src/main/java/io/hypersistence/utils/hibernate/type/basic/YearType.java +++ b/hypersistence-utils-hibernate-60/src/main/java/io/hypersistence/utils/hibernate/type/basic/YearType.java @@ -1,11 +1,13 @@ package io.hypersistence.utils.hibernate.type.basic; -import io.hypersistence.utils.hibernate.type.MutableType; +import io.hypersistence.utils.hibernate.type.DescriptorImmutableType; import io.hypersistence.utils.hibernate.type.basic.internal.YearTypeDescriptor; import io.hypersistence.utils.hibernate.type.util.Configuration; +import org.hibernate.HibernateException; import org.hibernate.type.descriptor.jdbc.SmallIntJdbcType; import java.time.Year; +import java.time.YearMonth; /** * Maps a Java {@link Year} object to an {@code INT} column type. @@ -14,7 +16,7 @@ * * @author Vlad Mihalcea */ -public class YearType extends MutableType { +public class YearType extends DescriptorImmutableType { public static final YearType INSTANCE = new YearType(); @@ -42,4 +44,9 @@ public YearType(org.hibernate.type.spi.TypeBootstrapContext typeBootstrapContext public String getName() { return "year"; } + + @Override + public Year fromStringValue(CharSequence charSequence) throws HibernateException { + return charSequence != null ? Year.parse(charSequence) : null; + } } \ No newline at end of file diff --git a/hypersistence-utils-hibernate-60/src/main/java/io/hypersistence/utils/hibernate/type/basic/ZoneIdType.java b/hypersistence-utils-hibernate-60/src/main/java/io/hypersistence/utils/hibernate/type/basic/ZoneIdType.java index b8153bbbb..5098ec7c3 100644 --- a/hypersistence-utils-hibernate-60/src/main/java/io/hypersistence/utils/hibernate/type/basic/ZoneIdType.java +++ b/hypersistence-utils-hibernate-60/src/main/java/io/hypersistence/utils/hibernate/type/basic/ZoneIdType.java @@ -1,10 +1,12 @@ package io.hypersistence.utils.hibernate.type.basic; -import io.hypersistence.utils.hibernate.type.MutableType; +import io.hypersistence.utils.hibernate.type.DescriptorImmutableType; import io.hypersistence.utils.hibernate.type.basic.internal.ZoneIdTypeDescriptor; import io.hypersistence.utils.hibernate.type.util.Configuration; +import org.hibernate.HibernateException; import org.hibernate.type.descriptor.jdbc.VarcharJdbcType; +import java.time.Year; import java.time.ZoneId; /** @@ -12,7 +14,7 @@ * * @author stonio */ -public class ZoneIdType extends MutableType { +public class ZoneIdType extends DescriptorImmutableType { public static final ZoneIdType INSTANCE = new ZoneIdType(); @@ -40,4 +42,9 @@ public ZoneIdType(org.hibernate.type.spi.TypeBootstrapContext typeBootstrapConte public String getName() { return "zone-id"; } + + @Override + public ZoneId fromStringValue(CharSequence charSequence) throws HibernateException { + return charSequence != null ? ZoneId.of((String) charSequence) : null; + } } diff --git a/hypersistence-utils-hibernate-60/src/main/java/io/hypersistence/utils/hibernate/type/basic/internal/Iso8601MonthMonthTypeDescriptor.java b/hypersistence-utils-hibernate-60/src/main/java/io/hypersistence/utils/hibernate/type/basic/internal/Iso8601MonthMonthTypeDescriptor.java index 47ee282df..3ee5587f7 100644 --- a/hypersistence-utils-hibernate-60/src/main/java/io/hypersistence/utils/hibernate/type/basic/internal/Iso8601MonthMonthTypeDescriptor.java +++ b/hypersistence-utils-hibernate-60/src/main/java/io/hypersistence/utils/hibernate/type/basic/internal/Iso8601MonthMonthTypeDescriptor.java @@ -9,8 +9,7 @@ /** * @author Martin Panzer */ -public class Iso8601MonthMonthTypeDescriptor - extends AbstractClassJavaType { +public class Iso8601MonthMonthTypeDescriptor extends AbstractClassJavaType { public static final Iso8601MonthMonthTypeDescriptor INSTANCE = new Iso8601MonthMonthTypeDescriptor(); diff --git a/hypersistence-utils-hibernate-60/src/main/java/io/hypersistence/utils/hibernate/type/interval/OracleIntervalDayToSecondType.java b/hypersistence-utils-hibernate-60/src/main/java/io/hypersistence/utils/hibernate/type/interval/OracleIntervalDayToSecondType.java index 181d6b578..044d650ab 100644 --- a/hypersistence-utils-hibernate-60/src/main/java/io/hypersistence/utils/hibernate/type/interval/OracleIntervalDayToSecondType.java +++ b/hypersistence-utils-hibernate-60/src/main/java/io/hypersistence/utils/hibernate/type/interval/OracleIntervalDayToSecondType.java @@ -87,4 +87,8 @@ public int getSqlType() { return SQL_COLUMN_TYPE; } + @Override + public Duration fromStringValue(CharSequence sequence) throws HibernateException { + return sequence != null ? Duration.parse(sequence) : null; + } } diff --git a/hypersistence-utils-hibernate-60/src/main/java/io/hypersistence/utils/hibernate/type/interval/PostgreSQLIntervalType.java b/hypersistence-utils-hibernate-60/src/main/java/io/hypersistence/utils/hibernate/type/interval/PostgreSQLIntervalType.java index 2debd11aa..4cef628f3 100644 --- a/hypersistence-utils-hibernate-60/src/main/java/io/hypersistence/utils/hibernate/type/interval/PostgreSQLIntervalType.java +++ b/hypersistence-utils-hibernate-60/src/main/java/io/hypersistence/utils/hibernate/type/interval/PostgreSQLIntervalType.java @@ -2,6 +2,7 @@ import io.hypersistence.utils.hibernate.type.ImmutableType; import io.hypersistence.utils.hibernate.type.util.Configuration; +import org.hibernate.HibernateException; import org.hibernate.engine.spi.SharedSessionContractImplementor; import org.postgresql.util.PGInterval; @@ -76,4 +77,8 @@ public int getSqlType() { return Types.OTHER; } + @Override + public Duration fromStringValue(CharSequence sequence) throws HibernateException { + return sequence != null ? Duration.parse(sequence) : null; + } } diff --git a/hypersistence-utils-hibernate-60/src/main/java/io/hypersistence/utils/hibernate/type/interval/PostgreSQLPeriodType.java b/hypersistence-utils-hibernate-60/src/main/java/io/hypersistence/utils/hibernate/type/interval/PostgreSQLPeriodType.java index 59f5bf348..b8907a3dc 100644 --- a/hypersistence-utils-hibernate-60/src/main/java/io/hypersistence/utils/hibernate/type/interval/PostgreSQLPeriodType.java +++ b/hypersistence-utils-hibernate-60/src/main/java/io/hypersistence/utils/hibernate/type/interval/PostgreSQLPeriodType.java @@ -2,6 +2,7 @@ import io.hypersistence.utils.hibernate.type.ImmutableType; import io.hypersistence.utils.hibernate.type.util.Configuration; +import org.hibernate.HibernateException; import org.hibernate.engine.spi.SharedSessionContractImplementor; import org.postgresql.util.PGInterval; @@ -65,4 +66,8 @@ public int getSqlType() { return Types.OTHER; } + @Override + public Period fromStringValue(CharSequence sequence) throws HibernateException { + return sequence != null ? Period.parse(sequence) : null; + } } diff --git a/hypersistence-utils-hibernate-60/src/main/java/io/hypersistence/utils/hibernate/type/money/CurrencyUnitType.java b/hypersistence-utils-hibernate-60/src/main/java/io/hypersistence/utils/hibernate/type/money/CurrencyUnitType.java index 89b15e49a..d1fa02775 100644 --- a/hypersistence-utils-hibernate-60/src/main/java/io/hypersistence/utils/hibernate/type/money/CurrencyUnitType.java +++ b/hypersistence-utils-hibernate-60/src/main/java/io/hypersistence/utils/hibernate/type/money/CurrencyUnitType.java @@ -1,7 +1,8 @@ package io.hypersistence.utils.hibernate.type.money; -import io.hypersistence.utils.hibernate.type.MutableType; +import io.hypersistence.utils.hibernate.type.DescriptorImmutableType; import io.hypersistence.utils.hibernate.type.money.internal.CurrencyUnitTypeDescriptor; +import org.hibernate.HibernateException; import org.hibernate.type.descriptor.jdbc.VarcharJdbcType; import javax.money.CurrencyUnit; @@ -11,8 +12,13 @@ * * @author Piotr Olaszewski */ -public class CurrencyUnitType extends MutableType { +public class CurrencyUnitType extends DescriptorImmutableType { public CurrencyUnitType() { super(CurrencyUnit.class, VarcharJdbcType.INSTANCE, CurrencyUnitTypeDescriptor.INSTANCE); } + + @Override + public CurrencyUnit fromStringValue(CharSequence sequence) throws HibernateException { + return getExpressibleJavaType().wrap(sequence, null); + } } diff --git a/hypersistence-utils-hibernate-60/src/main/java/io/hypersistence/utils/hibernate/type/range/PostgreSQLRangeType.java b/hypersistence-utils-hibernate-60/src/main/java/io/hypersistence/utils/hibernate/type/range/PostgreSQLRangeType.java index 9ae66292a..4ea38fee0 100644 --- a/hypersistence-utils-hibernate-60/src/main/java/io/hypersistence/utils/hibernate/type/range/PostgreSQLRangeType.java +++ b/hypersistence-utils-hibernate-60/src/main/java/io/hypersistence/utils/hibernate/type/range/PostgreSQLRangeType.java @@ -142,4 +142,43 @@ public Class getElementType() { (Class) ((ParameterizedType) type).getActualTypeArguments()[0] : null; } + @Override + public Range fromStringValue(CharSequence sequence) throws HibernateException { + if (sequence != null) { + String stringValue = (String) sequence; + Class clazz = rangeClass(); + if(clazz != null) { + if(Integer.class.isAssignableFrom(clazz)) { + return Range.integerRange(stringValue); + } + if(Long.class.isAssignableFrom(clazz)) { + return Range.longRange(stringValue); + } + if(BigDecimal.class.isAssignableFrom(clazz)) { + return Range.bigDecimalRange(stringValue); + } + if(LocalDateTime.class.isAssignableFrom(clazz)) { + return Range.localDateTimeRange(stringValue); + } + if(ZonedDateTime.class.isAssignableFrom(clazz)) { + return Range.zonedDateTimeRange(stringValue); + } + if(LocalDate.class.isAssignableFrom(clazz)) { + return Range.localDateRange(stringValue); + } + throw new HibernateException( + new IllegalStateException("The range type [" + type + "] is not supported!") + ); + } + } + return null; + } + + private Class rangeClass() { + if (type instanceof ParameterizedType) { + Type[] types = ((ParameterizedType) type).getActualTypeArguments(); + return (Class) types[0]; + } + return null; + } } diff --git a/hypersistence-utils-hibernate-60/src/main/java/io/hypersistence/utils/hibernate/type/range/guava/PostgreSQLGuavaRangeType.java b/hypersistence-utils-hibernate-60/src/main/java/io/hypersistence/utils/hibernate/type/range/guava/PostgreSQLGuavaRangeType.java index fc706b24d..50041d420 100644 --- a/hypersistence-utils-hibernate-60/src/main/java/io/hypersistence/utils/hibernate/type/range/guava/PostgreSQLGuavaRangeType.java +++ b/hypersistence-utils-hibernate-60/src/main/java/io/hypersistence/utils/hibernate/type/range/guava/PostgreSQLGuavaRangeType.java @@ -17,13 +17,7 @@ import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Types; -import java.time.Duration; -import java.time.LocalDate; -import java.time.LocalDateTime; -import java.time.OffsetDateTime; -import java.time.ZoneId; -import java.time.ZoneOffset; -import java.time.ZonedDateTime; +import java.time.*; import java.time.format.DateTimeFormatter; import java.time.format.DateTimeFormatterBuilder; import java.time.format.DateTimeParseException; @@ -528,4 +522,43 @@ public Class getElementType() { return elementType; } + @Override + public Range fromStringValue(CharSequence sequence) throws HibernateException { + if (sequence != null) { + String stringValue = (String) sequence; + Class clazz = rangeClass(); + if(clazz != null) { + if(Integer.class.isAssignableFrom(clazz)) { + return integerRange(stringValue); + } + if(Long.class.isAssignableFrom(clazz)) { + return longRange(stringValue); + } + if(BigDecimal.class.isAssignableFrom(clazz)) { + return bigDecimalRange(stringValue); + } + if(LocalDateTime.class.isAssignableFrom(clazz)) { + return localDateTimeRange(stringValue); + } + if(ZonedDateTime.class.isAssignableFrom(clazz)) { + return zonedDateTimeRange(stringValue); + } + if(LocalDate.class.isAssignableFrom(clazz)) { + return localDateRange(stringValue); + } + throw new HibernateException( + new IllegalStateException("The range type [" + type + "] is not supported!") + ); + } + } + return null; + } + + private Class rangeClass() { + if (type instanceof ParameterizedType) { + Type[] types = ((ParameterizedType) type).getActualTypeArguments(); + return (Class) types[0]; + } + return null; + } } diff --git a/hypersistence-utils-hibernate-60/src/test/java/io/hypersistence/utils/hibernate/type/basic/PostgreSQLYearMonthIdTest.java b/hypersistence-utils-hibernate-60/src/test/java/io/hypersistence/utils/hibernate/type/basic/PostgreSQLYearMonthIdTest.java new file mode 100644 index 000000000..a68f668a9 --- /dev/null +++ b/hypersistence-utils-hibernate-60/src/test/java/io/hypersistence/utils/hibernate/type/basic/PostgreSQLYearMonthIdTest.java @@ -0,0 +1,75 @@ +package io.hypersistence.utils.hibernate.type.basic; + +import io.hypersistence.utils.hibernate.util.AbstractPostgreSQLIntegrationTest; +import jakarta.persistence.Entity; +import jakarta.persistence.Id; +import org.hibernate.annotations.Type; +import org.hibernate.cfg.AvailableSettings; +import org.junit.Test; + +import java.time.YearMonth; +import java.util.Properties; + +import static org.junit.Assert.assertEquals; + +/** + * @author Vlad Mihalcea + */ +public class PostgreSQLYearMonthIdTest extends AbstractPostgreSQLIntegrationTest { + + @Override + protected Class[] entities() { + return new Class[]{ + YearMonthEntity.class + }; + } + + @Override + protected void additionalProperties(Properties properties) { + properties.put(AvailableSettings.STATEMENT_BATCH_SIZE, 50); + } + + @Test + public void test() { + doInJPA(entityManager -> { + YearMonthEntity entity = new YearMonthEntity(); + entity.setId(YearMonth.of(2016, 10)); + entity.setNotes("High-Performance Java Persistence"); + + entityManager.persist(entity); + }); + + doInJPA(entityManager -> { + YearMonthEntity entity = entityManager + .find(YearMonthEntity.class, YearMonth.of(2016, 10)); + + assertEquals("High-Performance Java Persistence", entity.getNotes()); + }); + } + + @Entity(name = "YearMonthEntity") + public static class YearMonthEntity { + + @Id + @Type(YearMonthIntegerType.class) + private YearMonth id; + + private String notes; + + public YearMonth getId() { + return id; + } + + public void setId(YearMonth id) { + this.id = id; + } + + public String getNotes() { + return notes; + } + + public void setNotes(String notes) { + this.notes = notes; + } + } +} diff --git a/hypersistence-utils-hibernate-62/src/main/java/io/hypersistence/utils/hibernate/type/DescriptorImmutableType.java b/hypersistence-utils-hibernate-62/src/main/java/io/hypersistence/utils/hibernate/type/DescriptorImmutableType.java new file mode 100644 index 000000000..e466abed6 --- /dev/null +++ b/hypersistence-utils-hibernate-62/src/main/java/io/hypersistence/utils/hibernate/type/DescriptorImmutableType.java @@ -0,0 +1,73 @@ +package io.hypersistence.utils.hibernate.type; + +import io.hypersistence.utils.hibernate.type.util.Configuration; +import org.hibernate.HibernateException; +import org.hibernate.engine.spi.SharedSessionContractImplementor; +import org.hibernate.query.BindableType; +import org.hibernate.query.sqm.SqmExpressible; +import org.hibernate.type.descriptor.java.JavaType; +import org.hibernate.type.descriptor.jdbc.JdbcType; +import org.hibernate.usertype.UserType; + +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; + +/** + * Very convenient base class for implementing immutable object types using Hibernate {@link UserType} using the {@link JdbcType} and {@link JavaType} descriptors. + * + * @author Vlad Mihalcea + */ +public abstract class DescriptorImmutableType> extends ImmutableType implements BindableType, SqmExpressible { + + private final JDBC jdbcTypeDescriptor; + private final JAVA javaTypeDescriptor; + + public DescriptorImmutableType(Class clazz, JDBC jdbcTypeDescriptor, JAVA javaTypeDescriptor) { + super(clazz); + this.jdbcTypeDescriptor = jdbcTypeDescriptor; + this.javaTypeDescriptor = javaTypeDescriptor; + } + + public DescriptorImmutableType(Class clazz, JDBC jdbcTypeDescriptor, JAVA javaTypeDescriptor, Configuration configuration) { + super(clazz, configuration); + this.jdbcTypeDescriptor = jdbcTypeDescriptor; + this.javaTypeDescriptor = javaTypeDescriptor; + } + + @Override + public T nullSafeGet(ResultSet rs, int position, SharedSessionContractImplementor session, Object owner) throws + SQLException { + return jdbcTypeDescriptor.getExtractor(javaTypeDescriptor).extract(rs, position, session); + } + + @Override + public void nullSafeSet(PreparedStatement st, Object value, int index, SharedSessionContractImplementor session) throws HibernateException, SQLException { + jdbcTypeDescriptor.getBinder(javaTypeDescriptor).bind(st, (T) value, index, session); + } + + @Override + protected T get(ResultSet rs, int position, SharedSessionContractImplementor session, Object owner) throws SQLException { + return nullSafeGet(rs, position, session, owner); + } + + @Override + protected void set(PreparedStatement st, T value, int index, SharedSessionContractImplementor session) throws SQLException { + nullSafeSet(st, value, index, session); + } + + @Override + public int getSqlType() { + return jdbcTypeDescriptor.getJdbcTypeCode(); + } + + @Override + public Class getBindableJavaType() { + return returnedClass(); + } + + @Override + public JavaType getExpressibleJavaType() { + return javaTypeDescriptor; + } +} diff --git a/hypersistence-utils-hibernate-62/src/main/java/io/hypersistence/utils/hibernate/type/ImmutableDynamicParameterizedType.java b/hypersistence-utils-hibernate-62/src/main/java/io/hypersistence/utils/hibernate/type/ImmutableDynamicParameterizedType.java index abb852c5c..41ce6ee4f 100644 --- a/hypersistence-utils-hibernate-62/src/main/java/io/hypersistence/utils/hibernate/type/ImmutableDynamicParameterizedType.java +++ b/hypersistence-utils-hibernate-62/src/main/java/io/hypersistence/utils/hibernate/type/ImmutableDynamicParameterizedType.java @@ -1,12 +1,14 @@ package io.hypersistence.utils.hibernate.type; import io.hypersistence.utils.hibernate.type.util.Configuration; +import org.hibernate.HibernateException; import org.hibernate.usertype.DynamicParameterizedType; +import org.hibernate.usertype.EnhancedUserType; /** * @author Vlad Mihalcea */ -public abstract class ImmutableDynamicParameterizedType extends ImmutableType implements DynamicParameterizedType { +public abstract class ImmutableDynamicParameterizedType extends ImmutableType implements DynamicParameterizedType, EnhancedUserType { /** * {@inheritDoc} @@ -21,4 +23,14 @@ public ImmutableDynamicParameterizedType(Class clazz) { public ImmutableDynamicParameterizedType(Class clazz, Configuration configuration) { super(clazz, configuration); } + + @Override + public String toSqlLiteral(T o) { + return toString(o); + } + + @Override + public String toString(T o) throws HibernateException { + return o != null ? o.toString() : null; + } } \ No newline at end of file diff --git a/hypersistence-utils-hibernate-62/src/main/java/io/hypersistence/utils/hibernate/type/ImmutableType.java b/hypersistence-utils-hibernate-62/src/main/java/io/hypersistence/utils/hibernate/type/ImmutableType.java index 70e7d78bd..aae5fe012 100644 --- a/hypersistence-utils-hibernate-62/src/main/java/io/hypersistence/utils/hibernate/type/ImmutableType.java +++ b/hypersistence-utils-hibernate-62/src/main/java/io/hypersistence/utils/hibernate/type/ImmutableType.java @@ -11,6 +11,7 @@ import org.hibernate.type.ForeignKeyDirection; import org.hibernate.type.Type; import org.hibernate.type.descriptor.java.IncomparableComparator; +import org.hibernate.usertype.EnhancedUserType; import org.hibernate.usertype.UserType; import java.io.Serializable; @@ -28,7 +29,7 @@ * * @author Vlad Mihalcea */ -public abstract class ImmutableType implements UserType, Type { +public abstract class ImmutableType implements UserType, Type, EnhancedUserType { private final Configuration configuration; @@ -288,4 +289,14 @@ public boolean[] toColumnNullness(Object value, Mapping mapping) { public int[] getSqlTypeCodes(Mapping mapping) throws MappingException { return new int[]{getSqlType()}; } + + @Override + public String toSqlLiteral(T o) { + return toString(o); + } + + @Override + public String toString(T o) throws HibernateException { + return o != null ? o.toString() : null; + } } diff --git a/hypersistence-utils-hibernate-62/src/main/java/io/hypersistence/utils/hibernate/type/MutableType.java b/hypersistence-utils-hibernate-62/src/main/java/io/hypersistence/utils/hibernate/type/MutableType.java index 72336e1f0..7304d43cd 100644 --- a/hypersistence-utils-hibernate-62/src/main/java/io/hypersistence/utils/hibernate/type/MutableType.java +++ b/hypersistence-utils-hibernate-62/src/main/java/io/hypersistence/utils/hibernate/type/MutableType.java @@ -5,13 +5,12 @@ import io.hypersistence.utils.hibernate.util.ReflectionUtils; import org.hibernate.HibernateException; import org.hibernate.engine.spi.SharedSessionContractImplementor; -import org.hibernate.mapping.IndexedConsumer; +import org.hibernate.internal.util.IndexedConsumer; import org.hibernate.metamodel.mapping.BasicValuedMapping; import org.hibernate.metamodel.mapping.JdbcMapping; import org.hibernate.metamodel.mapping.MappingType; import org.hibernate.query.BindableType; import org.hibernate.query.sqm.SqmExpressible; -import org.hibernate.sql.ast.Clause; import org.hibernate.type.descriptor.java.JavaType; import org.hibernate.type.descriptor.jdbc.JdbcType; import org.hibernate.type.internal.BasicTypeImpl; @@ -21,7 +20,6 @@ import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; -import java.time.YearMonth; /** * Very convenient base class for implementing immutable object types using Hibernate {@link UserType}. @@ -30,7 +28,7 @@ */ public abstract class MutableType> implements UserType, BindableType, SqmExpressible, BasicValuedMapping { - private final Class returnedClass; + private final Class clazz; private final JDBC jdbcTypeDescriptor; private final JAVA javaTypeDescriptor; @@ -42,25 +40,25 @@ public abstract class MutableType returnedClass, JDBC jdbcTypeDescriptor, JAVA javaTypeDescriptor) { - this(returnedClass, jdbcTypeDescriptor, javaTypeDescriptor, Configuration.INSTANCE); + public MutableType(Class clazz, JDBC jdbcTypeDescriptor, JAVA javaTypeDescriptor) { + this(clazz, jdbcTypeDescriptor, javaTypeDescriptor, Configuration.INSTANCE); } /** * Initialization constructor taking the {@link Class} * and using the provided {@link Configuration} object. * - * @param returnedClass The class returned by {@link UserType#nullSafeGet(ResultSet, int, SharedSessionContractImplementor, Object)}. + * @param clazz The class returned by {@link UserType#nullSafeGet(ResultSet, int, SharedSessionContractImplementor, Object)}. * @param jdbcTypeDescriptor the JDBC type descriptor * @param javaTypeDescriptor the Java type descriptor * @param configuration the configuration */ - public MutableType(Class returnedClass, JDBC jdbcTypeDescriptor, JAVA javaTypeDescriptor, Configuration configuration) { - this.returnedClass = returnedClass; + public MutableType(Class clazz, JDBC jdbcTypeDescriptor, JAVA javaTypeDescriptor, Configuration configuration) { + this.clazz = clazz; this.jdbcTypeDescriptor = jdbcTypeDescriptor; this.javaTypeDescriptor = javaTypeDescriptor; this.configuration = configuration; @@ -138,12 +136,12 @@ public int getSqlType() { @Override public Class returnedClass() { - return returnedClass; + return clazz; } @Override public Class getBindableJavaType() { - return returnedClass; + return clazz; } @Override @@ -173,7 +171,7 @@ public int forEachDisassembledJdbcValue(Object value, int offset, X x, Y } @Override - public int forEachJdbcType(int offset, org.hibernate.internal.util.IndexedConsumer action) { + public int forEachJdbcType(int offset, IndexedConsumer action) { action.accept(offset, jdbcMapping); return getJdbcTypeCount(); } diff --git a/hypersistence-utils-hibernate-62/src/main/java/io/hypersistence/utils/hibernate/type/basic/Iso8601MonthType.java b/hypersistence-utils-hibernate-62/src/main/java/io/hypersistence/utils/hibernate/type/basic/Iso8601MonthType.java index dc8e6835d..513edd3b0 100644 --- a/hypersistence-utils-hibernate-62/src/main/java/io/hypersistence/utils/hibernate/type/basic/Iso8601MonthType.java +++ b/hypersistence-utils-hibernate-62/src/main/java/io/hypersistence/utils/hibernate/type/basic/Iso8601MonthType.java @@ -1,8 +1,9 @@ package io.hypersistence.utils.hibernate.type.basic; -import io.hypersistence.utils.hibernate.type.MutableType; +import io.hypersistence.utils.hibernate.type.DescriptorImmutableType; import io.hypersistence.utils.hibernate.type.basic.internal.Iso8601MonthMonthTypeDescriptor; import io.hypersistence.utils.hibernate.type.util.Configuration; +import org.hibernate.HibernateException; import org.hibernate.type.descriptor.jdbc.IntegerJdbcType; import java.time.Month; @@ -14,7 +15,7 @@ * * @author Martin Panzer */ -public class Iso8601MonthType extends MutableType { +public class Iso8601MonthType extends DescriptorImmutableType { public static final Iso8601MonthType INSTANCE = new Iso8601MonthType(); @@ -42,4 +43,9 @@ public Iso8601MonthType(org.hibernate.type.spi.TypeBootstrapContext typeBootstra public String getName() { return "month"; } + + @Override + public Month fromStringValue(CharSequence sequence) throws HibernateException { + return sequence != null ? Month.valueOf((String) sequence) : null; + } } \ No newline at end of file diff --git a/hypersistence-utils-hibernate-62/src/main/java/io/hypersistence/utils/hibernate/type/basic/MonthDayDateType.java b/hypersistence-utils-hibernate-62/src/main/java/io/hypersistence/utils/hibernate/type/basic/MonthDayDateType.java index ba8298c09..c028bb59d 100644 --- a/hypersistence-utils-hibernate-62/src/main/java/io/hypersistence/utils/hibernate/type/basic/MonthDayDateType.java +++ b/hypersistence-utils-hibernate-62/src/main/java/io/hypersistence/utils/hibernate/type/basic/MonthDayDateType.java @@ -1,10 +1,13 @@ package io.hypersistence.utils.hibernate.type.basic; +import io.hypersistence.utils.hibernate.type.DescriptorImmutableType; import io.hypersistence.utils.hibernate.type.MutableType; import io.hypersistence.utils.hibernate.type.basic.internal.MonthDayTypeDescriptor; import io.hypersistence.utils.hibernate.type.util.Configuration; +import org.hibernate.HibernateException; import org.hibernate.type.descriptor.jdbc.DateJdbcType; +import java.time.Month; import java.time.MonthDay; /** @@ -13,7 +16,7 @@ * @author Mladen Savic (mladensavic94@gmail.com) */ -public class MonthDayDateType extends MutableType { +public class MonthDayDateType extends DescriptorImmutableType { public static final MonthDayDateType INSTANCE = new MonthDayDateType(); @@ -32,4 +35,9 @@ public MonthDayDateType(org.hibernate.type.spi.TypeBootstrapContext typeBootstra public String getName() { return "monthday-date"; } + + @Override + public MonthDay fromStringValue(CharSequence sequence) throws HibernateException { + return sequence != null ? MonthDay.parse(sequence) : null; + } } diff --git a/hypersistence-utils-hibernate-62/src/main/java/io/hypersistence/utils/hibernate/type/basic/MonthDayIntegerType.java b/hypersistence-utils-hibernate-62/src/main/java/io/hypersistence/utils/hibernate/type/basic/MonthDayIntegerType.java index 4dd84ea28..ebab78f25 100644 --- a/hypersistence-utils-hibernate-62/src/main/java/io/hypersistence/utils/hibernate/type/basic/MonthDayIntegerType.java +++ b/hypersistence-utils-hibernate-62/src/main/java/io/hypersistence/utils/hibernate/type/basic/MonthDayIntegerType.java @@ -1,8 +1,9 @@ package io.hypersistence.utils.hibernate.type.basic; -import io.hypersistence.utils.hibernate.type.MutableType; +import io.hypersistence.utils.hibernate.type.DescriptorImmutableType; import io.hypersistence.utils.hibernate.type.basic.internal.MonthDayTypeDescriptor; import io.hypersistence.utils.hibernate.type.util.Configuration; +import org.hibernate.HibernateException; import org.hibernate.type.descriptor.jdbc.IntegerJdbcType; import java.time.MonthDay; @@ -12,7 +13,7 @@ * * @author Mladen Savic (mladensavic94@gmail.com) */ -public class MonthDayIntegerType extends MutableType { +public class MonthDayIntegerType extends DescriptorImmutableType { public static final MonthDayIntegerType INSTANCE = new MonthDayIntegerType(); @@ -40,4 +41,9 @@ public MonthDayIntegerType(org.hibernate.type.spi.TypeBootstrapContext typeBoots public String getName() { return "monthday-int"; } + + @Override + public MonthDay fromStringValue(CharSequence sequence) throws HibernateException { + return sequence != null ? MonthDay.parse(sequence) : null; + } } diff --git a/hypersistence-utils-hibernate-62/src/main/java/io/hypersistence/utils/hibernate/type/basic/NullableCharacterType.java b/hypersistence-utils-hibernate-62/src/main/java/io/hypersistence/utils/hibernate/type/basic/NullableCharacterType.java index 0e94b5ea1..8711d3f84 100644 --- a/hypersistence-utils-hibernate-62/src/main/java/io/hypersistence/utils/hibernate/type/basic/NullableCharacterType.java +++ b/hypersistence-utils-hibernate-62/src/main/java/io/hypersistence/utils/hibernate/type/basic/NullableCharacterType.java @@ -2,6 +2,7 @@ import io.hypersistence.utils.hibernate.type.ImmutableType; import io.hypersistence.utils.hibernate.type.util.Configuration; +import org.hibernate.HibernateException; import org.hibernate.engine.spi.SharedSessionContractImplementor; import java.sql.PreparedStatement; @@ -49,4 +50,9 @@ public void set(PreparedStatement st, Character value, int index, st.setString(index, String.valueOf(value)); } } + + @Override + public Character fromStringValue(CharSequence sequence) throws HibernateException { + return sequence != null ? sequence.charAt(0) : null; + } } \ No newline at end of file diff --git a/hypersistence-utils-hibernate-62/src/main/java/io/hypersistence/utils/hibernate/type/basic/PostgreSQLCITextType.java b/hypersistence-utils-hibernate-62/src/main/java/io/hypersistence/utils/hibernate/type/basic/PostgreSQLCITextType.java index ae4b638ca..7b717ce65 100644 --- a/hypersistence-utils-hibernate-62/src/main/java/io/hypersistence/utils/hibernate/type/basic/PostgreSQLCITextType.java +++ b/hypersistence-utils-hibernate-62/src/main/java/io/hypersistence/utils/hibernate/type/basic/PostgreSQLCITextType.java @@ -2,6 +2,7 @@ import io.hypersistence.utils.hibernate.type.ImmutableType; import io.hypersistence.utils.hibernate.type.util.Configuration; +import org.hibernate.HibernateException; import org.hibernate.engine.spi.SharedSessionContractImplementor; import java.sql.PreparedStatement; @@ -42,4 +43,9 @@ protected String get(ResultSet rs, int position, SharedSessionContractImplemento protected void set(PreparedStatement st, String value, int index, SharedSessionContractImplementor session) throws SQLException { st.setObject(index, value, Types.OTHER); } + + @Override + public String fromStringValue(CharSequence sequence) throws HibernateException { + return (String) sequence; + } } diff --git a/hypersistence-utils-hibernate-62/src/main/java/io/hypersistence/utils/hibernate/type/basic/PostgreSQLEnumType.java b/hypersistence-utils-hibernate-62/src/main/java/io/hypersistence/utils/hibernate/type/basic/PostgreSQLEnumType.java index f7f28c4c2..6a6efae46 100644 --- a/hypersistence-utils-hibernate-62/src/main/java/io/hypersistence/utils/hibernate/type/basic/PostgreSQLEnumType.java +++ b/hypersistence-utils-hibernate-62/src/main/java/io/hypersistence/utils/hibernate/type/basic/PostgreSQLEnumType.java @@ -2,6 +2,7 @@ import io.hypersistence.utils.hibernate.type.ImmutableDynamicParameterizedType; import io.hypersistence.utils.hibernate.util.ReflectionUtils; +import org.hibernate.HibernateException; import org.hibernate.engine.spi.SharedSessionContractImplementor; import org.hibernate.type.EnumType; import org.hibernate.type.descriptor.ValueBinder; @@ -90,4 +91,9 @@ public Class returnedClass() { public int getSqlType() { return Types.OTHER; } + + @Override + public Enum fromStringValue(CharSequence charSequence) throws HibernateException { + return charSequence != null ? Enum.valueOf(enumType.returnedClass(), (String) charSequence) : null; + } } diff --git a/hypersistence-utils-hibernate-62/src/main/java/io/hypersistence/utils/hibernate/type/basic/PostgreSQLHStoreType.java b/hypersistence-utils-hibernate-62/src/main/java/io/hypersistence/utils/hibernate/type/basic/PostgreSQLHStoreType.java index f313376f1..137c2b282 100644 --- a/hypersistence-utils-hibernate-62/src/main/java/io/hypersistence/utils/hibernate/type/basic/PostgreSQLHStoreType.java +++ b/hypersistence-utils-hibernate-62/src/main/java/io/hypersistence/utils/hibernate/type/basic/PostgreSQLHStoreType.java @@ -1,7 +1,9 @@ package io.hypersistence.utils.hibernate.type.basic; import io.hypersistence.utils.hibernate.type.ImmutableType; +import io.hypersistence.utils.hibernate.type.json.internal.JacksonUtil; import io.hypersistence.utils.hibernate.type.util.Configuration; +import org.hibernate.HibernateException; import org.hibernate.engine.spi.SharedSessionContractImplementor; import java.sql.PreparedStatement; @@ -47,4 +49,18 @@ protected Map get(ResultSet rs, int position, SharedSessionContractImplementor s protected void set(PreparedStatement st, Map value, int index, SharedSessionContractImplementor session) throws SQLException { st.setObject(index, value); } + + @Override + public Map fromStringValue(CharSequence sequence) throws HibernateException { + try { + return JacksonUtil.fromString((String) sequence, Map.class); + } catch (Exception e) { + throw new IllegalArgumentException( + String.format( + "Could not transform the [%s] value to a Map!", + sequence + ) + ); + } + } } diff --git a/hypersistence-utils-hibernate-62/src/main/java/io/hypersistence/utils/hibernate/type/basic/PostgreSQLInetType.java b/hypersistence-utils-hibernate-62/src/main/java/io/hypersistence/utils/hibernate/type/basic/PostgreSQLInetType.java index 448d6c620..020e43d93 100644 --- a/hypersistence-utils-hibernate-62/src/main/java/io/hypersistence/utils/hibernate/type/basic/PostgreSQLInetType.java +++ b/hypersistence-utils-hibernate-62/src/main/java/io/hypersistence/utils/hibernate/type/basic/PostgreSQLInetType.java @@ -3,12 +3,14 @@ import io.hypersistence.utils.hibernate.type.ImmutableType; import io.hypersistence.utils.hibernate.type.util.Configuration; import io.hypersistence.utils.hibernate.util.ReflectionUtils; +import org.hibernate.HibernateException; import org.hibernate.engine.spi.SharedSessionContractImplementor; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Types; +import java.util.Map; /** * Maps an {@link Inet} object type to a PostgreSQL INET column type. @@ -53,4 +55,9 @@ public void set(PreparedStatement st, Inet value, int index, SharedSessionContra st.setObject(index, holder); } } + + @Override + public Inet fromStringValue(CharSequence sequence) throws HibernateException { + return sequence != null ? new Inet((String) sequence): null; + } } \ No newline at end of file diff --git a/hypersistence-utils-hibernate-62/src/main/java/io/hypersistence/utils/hibernate/type/basic/PostgreSQLLTreeType.java b/hypersistence-utils-hibernate-62/src/main/java/io/hypersistence/utils/hibernate/type/basic/PostgreSQLLTreeType.java index d53809e6f..b4cf5dff3 100644 --- a/hypersistence-utils-hibernate-62/src/main/java/io/hypersistence/utils/hibernate/type/basic/PostgreSQLLTreeType.java +++ b/hypersistence-utils-hibernate-62/src/main/java/io/hypersistence/utils/hibernate/type/basic/PostgreSQLLTreeType.java @@ -2,6 +2,7 @@ import io.hypersistence.utils.hibernate.type.ImmutableType; import io.hypersistence.utils.hibernate.type.util.Configuration; +import org.hibernate.HibernateException; import org.hibernate.engine.spi.SharedSessionContractImplementor; import java.sql.PreparedStatement; @@ -43,4 +44,9 @@ protected String get(ResultSet rs, int position, SharedSessionContractImplemento protected void set(PreparedStatement st, String value, int index, SharedSessionContractImplementor session) throws SQLException { st.setObject(index, value, Types.OTHER); } + + @Override + public String fromStringValue(CharSequence sequence) throws HibernateException { + return (String) sequence; + } } diff --git a/hypersistence-utils-hibernate-62/src/main/java/io/hypersistence/utils/hibernate/type/basic/YearMonthDateType.java b/hypersistence-utils-hibernate-62/src/main/java/io/hypersistence/utils/hibernate/type/basic/YearMonthDateType.java index d2dc711b1..cf0c4b5a3 100644 --- a/hypersistence-utils-hibernate-62/src/main/java/io/hypersistence/utils/hibernate/type/basic/YearMonthDateType.java +++ b/hypersistence-utils-hibernate-62/src/main/java/io/hypersistence/utils/hibernate/type/basic/YearMonthDateType.java @@ -1,8 +1,9 @@ package io.hypersistence.utils.hibernate.type.basic; -import io.hypersistence.utils.hibernate.type.MutableType; +import io.hypersistence.utils.hibernate.type.DescriptorImmutableType; import io.hypersistence.utils.hibernate.type.basic.internal.YearMonthTypeDescriptor; import io.hypersistence.utils.hibernate.type.util.Configuration; +import org.hibernate.HibernateException; import org.hibernate.type.descriptor.jdbc.DateJdbcType; import java.time.YearMonth; @@ -14,7 +15,7 @@ * * @author Vlad Mihalcea */ -public class YearMonthDateType extends MutableType { +public class YearMonthDateType extends DescriptorImmutableType { public static final YearMonthDateType INSTANCE = new YearMonthDateType(); @@ -42,4 +43,9 @@ public YearMonthDateType(org.hibernate.type.spi.TypeBootstrapContext typeBootstr public String getName() { return "yearmonth-date"; } + + @Override + public YearMonth fromStringValue(CharSequence charSequence) throws HibernateException { + return charSequence != null ? YearMonth.parse(charSequence) : null; + } } \ No newline at end of file diff --git a/hypersistence-utils-hibernate-62/src/main/java/io/hypersistence/utils/hibernate/type/basic/YearMonthEpochType.java b/hypersistence-utils-hibernate-62/src/main/java/io/hypersistence/utils/hibernate/type/basic/YearMonthEpochType.java index 515d0414b..82d4e2246 100644 --- a/hypersistence-utils-hibernate-62/src/main/java/io/hypersistence/utils/hibernate/type/basic/YearMonthEpochType.java +++ b/hypersistence-utils-hibernate-62/src/main/java/io/hypersistence/utils/hibernate/type/basic/YearMonthEpochType.java @@ -1,8 +1,9 @@ package io.hypersistence.utils.hibernate.type.basic; -import io.hypersistence.utils.hibernate.type.MutableType; +import io.hypersistence.utils.hibernate.type.DescriptorImmutableType; import io.hypersistence.utils.hibernate.type.basic.internal.YearMonthEpochTypeDescriptor; import io.hypersistence.utils.hibernate.type.util.Configuration; +import org.hibernate.HibernateException; import org.hibernate.type.descriptor.jdbc.SmallIntJdbcType; import java.time.YearMonth; @@ -13,7 +14,7 @@ * * @author Vlad Mihalcea */ -public class YearMonthEpochType extends MutableType { +public class YearMonthEpochType extends DescriptorImmutableType { public static final YearMonthEpochType INSTANCE = new YearMonthEpochType(); @@ -41,4 +42,9 @@ public YearMonthEpochType(org.hibernate.type.spi.TypeBootstrapContext typeBootst public String getName() { return "yearmonth-epoch"; } + + @Override + public YearMonth fromStringValue(CharSequence charSequence) throws HibernateException { + return charSequence != null ? YearMonth.parse(charSequence) : null; + } } \ No newline at end of file diff --git a/hypersistence-utils-hibernate-62/src/main/java/io/hypersistence/utils/hibernate/type/basic/YearMonthIntegerType.java b/hypersistence-utils-hibernate-62/src/main/java/io/hypersistence/utils/hibernate/type/basic/YearMonthIntegerType.java index c7d9a3acf..a51529a09 100644 --- a/hypersistence-utils-hibernate-62/src/main/java/io/hypersistence/utils/hibernate/type/basic/YearMonthIntegerType.java +++ b/hypersistence-utils-hibernate-62/src/main/java/io/hypersistence/utils/hibernate/type/basic/YearMonthIntegerType.java @@ -1,15 +1,11 @@ package io.hypersistence.utils.hibernate.type.basic; -import io.hypersistence.utils.hibernate.type.MutableType; +import io.hypersistence.utils.hibernate.type.DescriptorImmutableType; import io.hypersistence.utils.hibernate.type.basic.internal.YearMonthTypeDescriptor; import io.hypersistence.utils.hibernate.type.util.Configuration; -import org.hibernate.engine.spi.SharedSessionContractImplementor; -import org.hibernate.internal.util.IndexedConsumer; -import org.hibernate.metamodel.mapping.JdbcMapping; +import org.hibernate.HibernateException; import org.hibernate.type.descriptor.jdbc.IntegerJdbcType; -import java.sql.PreparedStatement; -import java.sql.SQLException; import java.time.YearMonth; /** @@ -19,7 +15,7 @@ * * @author Vlad Mihalcea */ -public class YearMonthIntegerType extends MutableType { +public class YearMonthIntegerType extends DescriptorImmutableType { public static final YearMonthIntegerType INSTANCE = new YearMonthIntegerType(); @@ -47,4 +43,9 @@ public YearMonthIntegerType(org.hibernate.type.spi.TypeBootstrapContext typeBoot public String getName() { return "yearmonth-int"; } + + @Override + public YearMonth fromStringValue(CharSequence charSequence) throws HibernateException { + return charSequence != null ? YearMonth.parse(charSequence) : null; + } } \ No newline at end of file diff --git a/hypersistence-utils-hibernate-62/src/main/java/io/hypersistence/utils/hibernate/type/basic/YearMonthTimestampType.java b/hypersistence-utils-hibernate-62/src/main/java/io/hypersistence/utils/hibernate/type/basic/YearMonthTimestampType.java index 9ad91ce84..d8cc08146 100644 --- a/hypersistence-utils-hibernate-62/src/main/java/io/hypersistence/utils/hibernate/type/basic/YearMonthTimestampType.java +++ b/hypersistence-utils-hibernate-62/src/main/java/io/hypersistence/utils/hibernate/type/basic/YearMonthTimestampType.java @@ -1,8 +1,9 @@ package io.hypersistence.utils.hibernate.type.basic; -import io.hypersistence.utils.hibernate.type.MutableType; +import io.hypersistence.utils.hibernate.type.DescriptorImmutableType; import io.hypersistence.utils.hibernate.type.basic.internal.YearMonthTypeDescriptor; import io.hypersistence.utils.hibernate.type.util.Configuration; +import org.hibernate.HibernateException; import org.hibernate.type.descriptor.jdbc.TimestampJdbcType; import java.time.YearMonth; @@ -13,7 +14,7 @@ * * @author Vlad Mihalcea */ -public class YearMonthTimestampType extends MutableType { +public class YearMonthTimestampType extends DescriptorImmutableType { public static final YearMonthTimestampType INSTANCE = new YearMonthTimestampType(); @@ -41,4 +42,9 @@ public YearMonthTimestampType(org.hibernate.type.spi.TypeBootstrapContext typeBo public String getName() { return "yearmonth-timestamp"; } + + @Override + public YearMonth fromStringValue(CharSequence charSequence) throws HibernateException { + return charSequence != null ? YearMonth.parse(charSequence) : null; + } } \ No newline at end of file diff --git a/hypersistence-utils-hibernate-62/src/main/java/io/hypersistence/utils/hibernate/type/basic/YearType.java b/hypersistence-utils-hibernate-62/src/main/java/io/hypersistence/utils/hibernate/type/basic/YearType.java index 9dcbba206..1624d9078 100644 --- a/hypersistence-utils-hibernate-62/src/main/java/io/hypersistence/utils/hibernate/type/basic/YearType.java +++ b/hypersistence-utils-hibernate-62/src/main/java/io/hypersistence/utils/hibernate/type/basic/YearType.java @@ -1,11 +1,13 @@ package io.hypersistence.utils.hibernate.type.basic; -import io.hypersistence.utils.hibernate.type.MutableType; +import io.hypersistence.utils.hibernate.type.DescriptorImmutableType; import io.hypersistence.utils.hibernate.type.basic.internal.YearTypeDescriptor; import io.hypersistence.utils.hibernate.type.util.Configuration; +import org.hibernate.HibernateException; import org.hibernate.type.descriptor.jdbc.SmallIntJdbcType; import java.time.Year; +import java.time.YearMonth; /** * Maps a Java {@link Year} object to an {@code INT} column type. @@ -14,7 +16,7 @@ * * @author Vlad Mihalcea */ -public class YearType extends MutableType { +public class YearType extends DescriptorImmutableType { public static final YearType INSTANCE = new YearType(); @@ -42,4 +44,9 @@ public YearType(org.hibernate.type.spi.TypeBootstrapContext typeBootstrapContext public String getName() { return "year"; } + + @Override + public Year fromStringValue(CharSequence charSequence) throws HibernateException { + return charSequence != null ? Year.parse(charSequence) : null; + } } \ No newline at end of file diff --git a/hypersistence-utils-hibernate-62/src/main/java/io/hypersistence/utils/hibernate/type/basic/ZoneIdType.java b/hypersistence-utils-hibernate-62/src/main/java/io/hypersistence/utils/hibernate/type/basic/ZoneIdType.java index b8153bbbb..5098ec7c3 100644 --- a/hypersistence-utils-hibernate-62/src/main/java/io/hypersistence/utils/hibernate/type/basic/ZoneIdType.java +++ b/hypersistence-utils-hibernate-62/src/main/java/io/hypersistence/utils/hibernate/type/basic/ZoneIdType.java @@ -1,10 +1,12 @@ package io.hypersistence.utils.hibernate.type.basic; -import io.hypersistence.utils.hibernate.type.MutableType; +import io.hypersistence.utils.hibernate.type.DescriptorImmutableType; import io.hypersistence.utils.hibernate.type.basic.internal.ZoneIdTypeDescriptor; import io.hypersistence.utils.hibernate.type.util.Configuration; +import org.hibernate.HibernateException; import org.hibernate.type.descriptor.jdbc.VarcharJdbcType; +import java.time.Year; import java.time.ZoneId; /** @@ -12,7 +14,7 @@ * * @author stonio */ -public class ZoneIdType extends MutableType { +public class ZoneIdType extends DescriptorImmutableType { public static final ZoneIdType INSTANCE = new ZoneIdType(); @@ -40,4 +42,9 @@ public ZoneIdType(org.hibernate.type.spi.TypeBootstrapContext typeBootstrapConte public String getName() { return "zone-id"; } + + @Override + public ZoneId fromStringValue(CharSequence charSequence) throws HibernateException { + return charSequence != null ? ZoneId.of((String) charSequence) : null; + } } diff --git a/hypersistence-utils-hibernate-62/src/main/java/io/hypersistence/utils/hibernate/type/basic/internal/Iso8601MonthMonthTypeDescriptor.java b/hypersistence-utils-hibernate-62/src/main/java/io/hypersistence/utils/hibernate/type/basic/internal/Iso8601MonthMonthTypeDescriptor.java index 47ee282df..3ee5587f7 100644 --- a/hypersistence-utils-hibernate-62/src/main/java/io/hypersistence/utils/hibernate/type/basic/internal/Iso8601MonthMonthTypeDescriptor.java +++ b/hypersistence-utils-hibernate-62/src/main/java/io/hypersistence/utils/hibernate/type/basic/internal/Iso8601MonthMonthTypeDescriptor.java @@ -9,8 +9,7 @@ /** * @author Martin Panzer */ -public class Iso8601MonthMonthTypeDescriptor - extends AbstractClassJavaType { +public class Iso8601MonthMonthTypeDescriptor extends AbstractClassJavaType { public static final Iso8601MonthMonthTypeDescriptor INSTANCE = new Iso8601MonthMonthTypeDescriptor(); diff --git a/hypersistence-utils-hibernate-62/src/main/java/io/hypersistence/utils/hibernate/type/interval/OracleIntervalDayToSecondType.java b/hypersistence-utils-hibernate-62/src/main/java/io/hypersistence/utils/hibernate/type/interval/OracleIntervalDayToSecondType.java index 181d6b578..044d650ab 100644 --- a/hypersistence-utils-hibernate-62/src/main/java/io/hypersistence/utils/hibernate/type/interval/OracleIntervalDayToSecondType.java +++ b/hypersistence-utils-hibernate-62/src/main/java/io/hypersistence/utils/hibernate/type/interval/OracleIntervalDayToSecondType.java @@ -87,4 +87,8 @@ public int getSqlType() { return SQL_COLUMN_TYPE; } + @Override + public Duration fromStringValue(CharSequence sequence) throws HibernateException { + return sequence != null ? Duration.parse(sequence) : null; + } } diff --git a/hypersistence-utils-hibernate-62/src/main/java/io/hypersistence/utils/hibernate/type/interval/PostgreSQLIntervalType.java b/hypersistence-utils-hibernate-62/src/main/java/io/hypersistence/utils/hibernate/type/interval/PostgreSQLIntervalType.java index 2debd11aa..4cef628f3 100644 --- a/hypersistence-utils-hibernate-62/src/main/java/io/hypersistence/utils/hibernate/type/interval/PostgreSQLIntervalType.java +++ b/hypersistence-utils-hibernate-62/src/main/java/io/hypersistence/utils/hibernate/type/interval/PostgreSQLIntervalType.java @@ -2,6 +2,7 @@ import io.hypersistence.utils.hibernate.type.ImmutableType; import io.hypersistence.utils.hibernate.type.util.Configuration; +import org.hibernate.HibernateException; import org.hibernate.engine.spi.SharedSessionContractImplementor; import org.postgresql.util.PGInterval; @@ -76,4 +77,8 @@ public int getSqlType() { return Types.OTHER; } + @Override + public Duration fromStringValue(CharSequence sequence) throws HibernateException { + return sequence != null ? Duration.parse(sequence) : null; + } } diff --git a/hypersistence-utils-hibernate-62/src/main/java/io/hypersistence/utils/hibernate/type/interval/PostgreSQLPeriodType.java b/hypersistence-utils-hibernate-62/src/main/java/io/hypersistence/utils/hibernate/type/interval/PostgreSQLPeriodType.java index 59f5bf348..b8907a3dc 100644 --- a/hypersistence-utils-hibernate-62/src/main/java/io/hypersistence/utils/hibernate/type/interval/PostgreSQLPeriodType.java +++ b/hypersistence-utils-hibernate-62/src/main/java/io/hypersistence/utils/hibernate/type/interval/PostgreSQLPeriodType.java @@ -2,6 +2,7 @@ import io.hypersistence.utils.hibernate.type.ImmutableType; import io.hypersistence.utils.hibernate.type.util.Configuration; +import org.hibernate.HibernateException; import org.hibernate.engine.spi.SharedSessionContractImplementor; import org.postgresql.util.PGInterval; @@ -65,4 +66,8 @@ public int getSqlType() { return Types.OTHER; } + @Override + public Period fromStringValue(CharSequence sequence) throws HibernateException { + return sequence != null ? Period.parse(sequence) : null; + } } diff --git a/hypersistence-utils-hibernate-62/src/main/java/io/hypersistence/utils/hibernate/type/json/JsonNodeStringType.java b/hypersistence-utils-hibernate-62/src/main/java/io/hypersistence/utils/hibernate/type/json/JsonNodeStringType.java index 66914cb39..b0d2c1b4e 100644 --- a/hypersistence-utils-hibernate-62/src/main/java/io/hypersistence/utils/hibernate/type/json/JsonNodeStringType.java +++ b/hypersistence-utils-hibernate-62/src/main/java/io/hypersistence/utils/hibernate/type/json/JsonNodeStringType.java @@ -5,7 +5,6 @@ import io.hypersistence.utils.hibernate.type.MutableDynamicParameterizedType; import io.hypersistence.utils.hibernate.type.json.internal.JsonNodeJavaTypeDescriptor; import io.hypersistence.utils.hibernate.type.json.internal.JsonStringJdbcTypeDescriptor; -import io.hypersistence.utils.hibernate.type.util.Configuration; import io.hypersistence.utils.hibernate.type.util.JsonConfiguration; import io.hypersistence.utils.hibernate.type.util.ObjectMapperWrapper; diff --git a/hypersistence-utils-hibernate-62/src/main/java/io/hypersistence/utils/hibernate/type/json/JsonStringType.java b/hypersistence-utils-hibernate-62/src/main/java/io/hypersistence/utils/hibernate/type/json/JsonStringType.java index 3907c50d3..605af8282 100644 --- a/hypersistence-utils-hibernate-62/src/main/java/io/hypersistence/utils/hibernate/type/json/JsonStringType.java +++ b/hypersistence-utils-hibernate-62/src/main/java/io/hypersistence/utils/hibernate/type/json/JsonStringType.java @@ -4,7 +4,6 @@ import io.hypersistence.utils.hibernate.type.MutableDynamicParameterizedType; import io.hypersistence.utils.hibernate.type.json.internal.JsonJavaTypeDescriptor; import io.hypersistence.utils.hibernate.type.json.internal.JsonStringJdbcTypeDescriptor; -import io.hypersistence.utils.hibernate.type.util.Configuration; import io.hypersistence.utils.hibernate.type.util.JsonConfiguration; import io.hypersistence.utils.hibernate.type.util.ObjectMapperWrapper; diff --git a/hypersistence-utils-hibernate-62/src/main/java/io/hypersistence/utils/hibernate/type/json/JsonType.java b/hypersistence-utils-hibernate-62/src/main/java/io/hypersistence/utils/hibernate/type/json/JsonType.java index abbb153f3..9980079d1 100644 --- a/hypersistence-utils-hibernate-62/src/main/java/io/hypersistence/utils/hibernate/type/json/JsonType.java +++ b/hypersistence-utils-hibernate-62/src/main/java/io/hypersistence/utils/hibernate/type/json/JsonType.java @@ -4,7 +4,6 @@ import io.hypersistence.utils.hibernate.type.MutableDynamicParameterizedType; import io.hypersistence.utils.hibernate.type.json.internal.JsonJavaTypeDescriptor; import io.hypersistence.utils.hibernate.type.json.internal.JsonJdbcTypeDescriptor; -import io.hypersistence.utils.hibernate.type.util.Configuration; import io.hypersistence.utils.hibernate.type.util.JsonConfiguration; import io.hypersistence.utils.hibernate.type.util.ObjectMapperWrapper; diff --git a/hypersistence-utils-hibernate-62/src/main/java/io/hypersistence/utils/hibernate/type/money/CurrencyUnitType.java b/hypersistence-utils-hibernate-62/src/main/java/io/hypersistence/utils/hibernate/type/money/CurrencyUnitType.java index 89b15e49a..d1fa02775 100644 --- a/hypersistence-utils-hibernate-62/src/main/java/io/hypersistence/utils/hibernate/type/money/CurrencyUnitType.java +++ b/hypersistence-utils-hibernate-62/src/main/java/io/hypersistence/utils/hibernate/type/money/CurrencyUnitType.java @@ -1,7 +1,8 @@ package io.hypersistence.utils.hibernate.type.money; -import io.hypersistence.utils.hibernate.type.MutableType; +import io.hypersistence.utils.hibernate.type.DescriptorImmutableType; import io.hypersistence.utils.hibernate.type.money.internal.CurrencyUnitTypeDescriptor; +import org.hibernate.HibernateException; import org.hibernate.type.descriptor.jdbc.VarcharJdbcType; import javax.money.CurrencyUnit; @@ -11,8 +12,13 @@ * * @author Piotr Olaszewski */ -public class CurrencyUnitType extends MutableType { +public class CurrencyUnitType extends DescriptorImmutableType { public CurrencyUnitType() { super(CurrencyUnit.class, VarcharJdbcType.INSTANCE, CurrencyUnitTypeDescriptor.INSTANCE); } + + @Override + public CurrencyUnit fromStringValue(CharSequence sequence) throws HibernateException { + return getExpressibleJavaType().wrap(sequence, null); + } } diff --git a/hypersistence-utils-hibernate-62/src/main/java/io/hypersistence/utils/hibernate/type/range/PostgreSQLRangeType.java b/hypersistence-utils-hibernate-62/src/main/java/io/hypersistence/utils/hibernate/type/range/PostgreSQLRangeType.java index 9ae66292a..4ea38fee0 100644 --- a/hypersistence-utils-hibernate-62/src/main/java/io/hypersistence/utils/hibernate/type/range/PostgreSQLRangeType.java +++ b/hypersistence-utils-hibernate-62/src/main/java/io/hypersistence/utils/hibernate/type/range/PostgreSQLRangeType.java @@ -142,4 +142,43 @@ public Class getElementType() { (Class) ((ParameterizedType) type).getActualTypeArguments()[0] : null; } + @Override + public Range fromStringValue(CharSequence sequence) throws HibernateException { + if (sequence != null) { + String stringValue = (String) sequence; + Class clazz = rangeClass(); + if(clazz != null) { + if(Integer.class.isAssignableFrom(clazz)) { + return Range.integerRange(stringValue); + } + if(Long.class.isAssignableFrom(clazz)) { + return Range.longRange(stringValue); + } + if(BigDecimal.class.isAssignableFrom(clazz)) { + return Range.bigDecimalRange(stringValue); + } + if(LocalDateTime.class.isAssignableFrom(clazz)) { + return Range.localDateTimeRange(stringValue); + } + if(ZonedDateTime.class.isAssignableFrom(clazz)) { + return Range.zonedDateTimeRange(stringValue); + } + if(LocalDate.class.isAssignableFrom(clazz)) { + return Range.localDateRange(stringValue); + } + throw new HibernateException( + new IllegalStateException("The range type [" + type + "] is not supported!") + ); + } + } + return null; + } + + private Class rangeClass() { + if (type instanceof ParameterizedType) { + Type[] types = ((ParameterizedType) type).getActualTypeArguments(); + return (Class) types[0]; + } + return null; + } } diff --git a/hypersistence-utils-hibernate-62/src/main/java/io/hypersistence/utils/hibernate/type/range/Range.java b/hypersistence-utils-hibernate-62/src/main/java/io/hypersistence/utils/hibernate/type/range/Range.java index a17b7de41..75f94c65e 100644 --- a/hypersistence-utils-hibernate-62/src/main/java/io/hypersistence/utils/hibernate/type/range/Range.java +++ b/hypersistence-utils-hibernate-62/src/main/java/io/hypersistence/utils/hibernate/type/range/Range.java @@ -495,7 +495,7 @@ private static Function unquote() { }; } - private boolean isBounded() { + public boolean isBounded() { return !hasMask(LOWER_INFINITE) && !hasMask(UPPER_INFINITE); } @@ -639,12 +639,12 @@ public boolean isEmpty() { return isBoundedOpen() && hasEqualBounds(); } - private boolean hasEqualBounds() { + public boolean hasEqualBounds() { return lower == null && upper == null || lower != null && upper != null && lower.compareTo(upper) == 0; } - private boolean isBoundedOpen() { + public boolean isBoundedOpen() { return isBounded() && !isLowerBoundClosed() && !isUpperBoundClosed(); } diff --git a/hypersistence-utils-hibernate-62/src/main/java/io/hypersistence/utils/hibernate/type/range/guava/PostgreSQLGuavaRangeType.java b/hypersistence-utils-hibernate-62/src/main/java/io/hypersistence/utils/hibernate/type/range/guava/PostgreSQLGuavaRangeType.java index fc706b24d..50041d420 100644 --- a/hypersistence-utils-hibernate-62/src/main/java/io/hypersistence/utils/hibernate/type/range/guava/PostgreSQLGuavaRangeType.java +++ b/hypersistence-utils-hibernate-62/src/main/java/io/hypersistence/utils/hibernate/type/range/guava/PostgreSQLGuavaRangeType.java @@ -17,13 +17,7 @@ import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Types; -import java.time.Duration; -import java.time.LocalDate; -import java.time.LocalDateTime; -import java.time.OffsetDateTime; -import java.time.ZoneId; -import java.time.ZoneOffset; -import java.time.ZonedDateTime; +import java.time.*; import java.time.format.DateTimeFormatter; import java.time.format.DateTimeFormatterBuilder; import java.time.format.DateTimeParseException; @@ -528,4 +522,43 @@ public Class getElementType() { return elementType; } + @Override + public Range fromStringValue(CharSequence sequence) throws HibernateException { + if (sequence != null) { + String stringValue = (String) sequence; + Class clazz = rangeClass(); + if(clazz != null) { + if(Integer.class.isAssignableFrom(clazz)) { + return integerRange(stringValue); + } + if(Long.class.isAssignableFrom(clazz)) { + return longRange(stringValue); + } + if(BigDecimal.class.isAssignableFrom(clazz)) { + return bigDecimalRange(stringValue); + } + if(LocalDateTime.class.isAssignableFrom(clazz)) { + return localDateTimeRange(stringValue); + } + if(ZonedDateTime.class.isAssignableFrom(clazz)) { + return zonedDateTimeRange(stringValue); + } + if(LocalDate.class.isAssignableFrom(clazz)) { + return localDateRange(stringValue); + } + throw new HibernateException( + new IllegalStateException("The range type [" + type + "] is not supported!") + ); + } + } + return null; + } + + private Class rangeClass() { + if (type instanceof ParameterizedType) { + Type[] types = ((ParameterizedType) type).getActualTypeArguments(); + return (Class) types[0]; + } + return null; + } } diff --git a/hypersistence-utils-hibernate-62/src/test/java/io/hypersistence/utils/hibernate/type/basic/PostgreSQLYearMonthEpochTest.java b/hypersistence-utils-hibernate-62/src/test/java/io/hypersistence/utils/hibernate/type/basic/PostgreSQLYearMonthEpochTest.java index 5f8845af4..0e37cebc0 100644 --- a/hypersistence-utils-hibernate-62/src/test/java/io/hypersistence/utils/hibernate/type/basic/PostgreSQLYearMonthEpochTest.java +++ b/hypersistence-utils-hibernate-62/src/test/java/io/hypersistence/utils/hibernate/type/basic/PostgreSQLYearMonthEpochTest.java @@ -56,16 +56,15 @@ public void test() { }); doInJPA(entityManager -> { - Book book = entityManager - .createQuery( - "select b " + - "from Book b " + - "where " + - " b.title = :title and " + - " b.publishedOn = :publishedOn", Book.class) - .setParameter("title", "High-Performance Java Persistence") - .setParameter("publishedOn", YearMonth.of(2016, 10)) - .getSingleResult(); + Book book = entityManager.createQuery( + "select b " + + "from Book b " + + "where " + + " b.title = :title and " + + " b.publishedOn = :publishedOn", Book.class) + .setParameter("title", "High-Performance Java Persistence") + .setParameter("publishedOn", YearMonth.of(2016, 10)) + .getSingleResult(); assertEquals("978-9730228236", book.getIsbn()); }); @@ -115,17 +114,17 @@ public void testIndexing() { List executionPlanLines = doInJPA(entityManager -> { return entityManager.createNativeQuery( - "EXPLAIN ANALYZE " + - "SELECT " + - " b.published_on " + - "FROM " + - " book b " + - "WHERE " + - " b.published_on BETWEEN :startYearMonth AND :endYearMonth ") - .unwrap(NativeQuery.class) - .setParameter("startYearMonth", YearMonth.of(2010, 12), YearMonthEpochType.INSTANCE) - .setParameter("endYearMonth", YearMonth.of(2018, 1), YearMonthEpochType.INSTANCE) - .getResultList(); + "EXPLAIN ANALYZE " + + "SELECT " + + " b.published_on " + + "FROM " + + " book b " + + "WHERE " + + " b.published_on BETWEEN :startYearMonth AND :endYearMonth ") + .unwrap(NativeQuery.class) + .setParameter("startYearMonth", YearMonth.of(2010, 12), YearMonthEpochType.INSTANCE) + .setParameter("endYearMonth", YearMonth.of(2018, 1), YearMonthEpochType.INSTANCE) + .getResultList(); }); LOGGER.info("Execution plan: \n{}", executionPlanLines.stream().collect(Collectors.joining("\n"))); diff --git a/hypersistence-utils-hibernate-62/src/test/java/io/hypersistence/utils/hibernate/type/basic/PostgreSQLYearMonthIdTest.java b/hypersistence-utils-hibernate-62/src/test/java/io/hypersistence/utils/hibernate/type/basic/PostgreSQLYearMonthIdTest.java new file mode 100644 index 000000000..6edcc4729 --- /dev/null +++ b/hypersistence-utils-hibernate-62/src/test/java/io/hypersistence/utils/hibernate/type/basic/PostgreSQLYearMonthIdTest.java @@ -0,0 +1,76 @@ +package io.hypersistence.utils.hibernate.type.basic; + +import io.hypersistence.utils.hibernate.util.AbstractPostgreSQLIntegrationTest; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.Id; +import org.hibernate.annotations.Type; +import org.hibernate.cfg.AvailableSettings; +import org.junit.Test; + +import java.time.YearMonth; +import java.util.Properties; + +import static org.junit.Assert.assertEquals; + +/** + * @author Vlad Mihalcea + */ +public class PostgreSQLYearMonthIdTest extends AbstractPostgreSQLIntegrationTest { + + @Override + protected Class[] entities() { + return new Class[]{ + YearMonthEntity.class + }; + } + + @Override + protected void additionalProperties(Properties properties) { + properties.put(AvailableSettings.STATEMENT_BATCH_SIZE, 50); + } + + @Test + public void test() { + doInJPA(entityManager -> { + YearMonthEntity entity = new YearMonthEntity(); + entity.setId(YearMonth.of(2016, 10)); + entity.setNotes("High-Performance Java Persistence"); + + entityManager.persist(entity); + }); + + doInJPA(entityManager -> { + YearMonthEntity entity = entityManager + .find(YearMonthEntity.class, YearMonth.of(2016, 10)); + + assertEquals("High-Performance Java Persistence", entity.getNotes()); + }); + } + + @Entity(name = "YearMonthEntity") + public static class YearMonthEntity { + + @Id + @Type(YearMonthIntegerType.class) + private YearMonth id; + + private String notes; + + public YearMonth getId() { + return id; + } + + public void setId(YearMonth id) { + this.id = id; + } + + public String getNotes() { + return notes; + } + + public void setNotes(String notes) { + this.notes = notes; + } + } +}