From 53834ca0d9e872f23a02cbe6afa06d1970e58e91 Mon Sep 17 00:00:00 2001 From: gtoison Date: Thu, 9 Sep 2021 21:02:56 +0200 Subject: [PATCH 1/2] HHH-14820 Reproducer A simple unit test illustrating issue HHH-14820 : since Hibernate ORM 6 the custom NamedEnumUserType is only instantiated once (while there are two enums configured with this type) --- .../converted/enums/NamedEnumUserType.java | 21 ++++++++ .../enums/NamedEnumUserTypeTest.java | 50 +++++++++++++++++++ .../enums/PersonNamedEnumsUserType.xml | 30 +++++++++++ 3 files changed, 101 insertions(+) create mode 100644 hibernate-core/src/test/java/org/hibernate/orm/test/mapping/converted/enums/NamedEnumUserType.java create mode 100644 hibernate-core/src/test/java/org/hibernate/orm/test/mapping/converted/enums/NamedEnumUserTypeTest.java create mode 100644 hibernate-core/src/test/resources/org/hibernate/orm/test/mapping/converted/enums/PersonNamedEnumsUserType.xml diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/mapping/converted/enums/NamedEnumUserType.java b/hibernate-core/src/test/java/org/hibernate/orm/test/mapping/converted/enums/NamedEnumUserType.java new file mode 100644 index 000000000000..c75b73647da8 --- /dev/null +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/mapping/converted/enums/NamedEnumUserType.java @@ -0,0 +1,21 @@ +package org.hibernate.orm.test.mapping.converted.enums; + +import java.util.Properties; + +import org.hibernate.type.EnumType; + +/** + * A simple user type where we force enums to be saved by name, not ordinal + * + * @author gtoison + */ +public class NamedEnumUserType> extends EnumType { + private static final long serialVersionUID = -4176945793071035928L; + + @Override + public void setParameterValues(Properties parameters) { + parameters.setProperty(EnumType.NAMED, "true"); + + super.setParameterValues(parameters); + } +} \ No newline at end of file diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/mapping/converted/enums/NamedEnumUserTypeTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/mapping/converted/enums/NamedEnumUserTypeTest.java new file mode 100644 index 000000000000..ca72d826dca9 --- /dev/null +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/mapping/converted/enums/NamedEnumUserTypeTest.java @@ -0,0 +1,50 @@ +/** + * + */ +package org.hibernate.orm.test.mapping.converted.enums; + +import static org.hibernate.testing.transaction.TransactionUtil.doInHibernate; + +import org.hibernate.testing.TestForIssue; +import org.hibernate.testing.junit4.BaseCoreFunctionalTestCase; +import org.junit.Ignore; +import org.junit.Test; + +/** + * @author gtoison + * + */ +public class NamedEnumUserTypeTest extends BaseCoreFunctionalTestCase { + + @Override + protected String getBaseForMappings() { + return ""; + } + + @Override + protected String[] getMappings() { + return new String[] { "org/hibernate/orm/test/mapping/converted/enums/PersonNamedEnumsUserType.xml" }; + } + + @Override + protected void prepareTest() { + doInHibernate( this::sessionFactory, s -> { + s.persist( Person.person( Gender.MALE, HairColor.BLACK ) ); + } ); + } + + @Override + protected boolean isCleanupTestDataRequired() { + return true; + } + + @Ignore + @Test + @TestForIssue(jiraKey = "HHH-14820") + public void testNamedEnumUserType() { + // This fails because the same instance of NamedEnumUserType is used for both enums + doInHibernate( this::sessionFactory, s -> { + s.createQuery( "from Person p", Person.class ); + } ); + } +} diff --git a/hibernate-core/src/test/resources/org/hibernate/orm/test/mapping/converted/enums/PersonNamedEnumsUserType.xml b/hibernate-core/src/test/resources/org/hibernate/orm/test/mapping/converted/enums/PersonNamedEnumsUserType.xml new file mode 100644 index 000000000000..a0670839c40b --- /dev/null +++ b/hibernate-core/src/test/resources/org/hibernate/orm/test/mapping/converted/enums/PersonNamedEnumsUserType.xml @@ -0,0 +1,30 @@ + + + + + + + org.hibernate.orm.test.mapping.converted.enums.Gender + + + org.hibernate.orm.test.mapping.converted.enums.HairColor + + + + + + + + + + + + + \ No newline at end of file From 2c1f33ad6db47fe08d39e7e51aef2127190f25eb Mon Sep 17 00:00:00 2001 From: gtoison Date: Thu, 30 Sep 2021 18:40:02 +0200 Subject: [PATCH 2/2] Removed @Ignore so the query is executed --- .../orm/test/mapping/converted/enums/NamedEnumUserTypeTest.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/mapping/converted/enums/NamedEnumUserTypeTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/mapping/converted/enums/NamedEnumUserTypeTest.java index ca72d826dca9..f4355f4f9e83 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/mapping/converted/enums/NamedEnumUserTypeTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/mapping/converted/enums/NamedEnumUserTypeTest.java @@ -7,7 +7,6 @@ import org.hibernate.testing.TestForIssue; import org.hibernate.testing.junit4.BaseCoreFunctionalTestCase; -import org.junit.Ignore; import org.junit.Test; /** @@ -38,7 +37,6 @@ protected boolean isCleanupTestDataRequired() { return true; } - @Ignore @Test @TestForIssue(jiraKey = "HHH-14820") public void testNamedEnumUserType() {