diff --git a/hibernate-core/src/test/java/org/hibernate/test/annotations/enumerated/mappedSuperclass/EnumeratedWithMappedSuperclassTest.java b/hibernate-core/src/test/java/org/hibernate/test/annotations/enumerated/mappedSuperclass/EnumeratedWithMappedSuperclassTest.java new file mode 100644 index 0000000000..d3e700203a --- /dev/null +++ b/hibernate-core/src/test/java/org/hibernate/test/annotations/enumerated/mappedSuperclass/EnumeratedWithMappedSuperclassTest.java @@ -0,0 +1,185 @@ +/* + * Hibernate, Relational Persistence for Idiomatic Java + * + * License: GNU Lesser General Public License (LGPL), version 2.1 or later. + * See the lgpl.txt file in the root directory or . + */ +package org.hibernate.test.annotations.enumerated.mappedSuperclass; + +import java.io.Serializable; +import java.sql.Types; +import javax.persistence.Column; +import javax.persistence.Enumerated; +import javax.persistence.GeneratedValue; +import javax.persistence.Id; +import javax.persistence.MappedSuperclass; +import javax.persistence.Table; + +import org.hibernate.annotations.GenericGenerator; +import org.hibernate.boot.Metadata; +import org.hibernate.boot.MetadataSources; +import org.hibernate.boot.registry.StandardServiceRegistry; +import org.hibernate.boot.registry.StandardServiceRegistryBuilder; +import org.hibernate.cfg.AvailableSettings; +import org.hibernate.dialect.PostgreSQL81Dialect; +import org.hibernate.engine.spi.SessionFactoryImplementor; +import org.hibernate.mapping.PersistentClass; +import org.hibernate.mapping.Property; +import org.hibernate.persister.entity.EntityPersister; +import org.hibernate.type.CustomType; +import org.hibernate.type.EnumType; + +import org.hibernate.testing.junit4.BaseUnitTestCase; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +import static javax.persistence.EnumType.STRING; +import static org.hibernate.testing.junit4.ExtraAssertions.assertTyping; +import static org.junit.Assert.assertEquals; + +/** + * Originally developed to verify/diagnose HHH-10128 + * + * @author Steve Ebersole + */ +public class EnumeratedWithMappedSuperclassTest extends BaseUnitTestCase { + private StandardServiceRegistry ssr; + + @Before + public void before() { + ssr = new StandardServiceRegistryBuilder() + .applySetting( AvailableSettings.DIALECT, PostgreSQL81Dialect.class ) + .build(); + } + + @After + public void after() { + if ( ssr != null ) { + StandardServiceRegistryBuilder.destroy( ssr ); + } + } + + @Test + public void testHHH10128() { + final Metadata metadata = new MetadataSources( ssr ) + .addAnnotatedClass( Entity.class ) + .addAnnotatedClass( DescriptionEntity.class ) + .addAnnotatedClass( AddressLevel.class ) + .buildMetadata(); + + final PersistentClass addressLevelBinding = metadata.getEntityBinding( AddressLevel.class.getName() ); + + final Property natureProperty = addressLevelBinding.getProperty( "nature" ); + CustomType customType = assertTyping( CustomType.class, natureProperty.getType() ); + EnumType enumType = assertTyping( EnumType.class, customType.getUserType() ); + assertEquals( Types.VARCHAR, enumType.sqlTypes()[0] ); + + SessionFactoryImplementor sf = (SessionFactoryImplementor) metadata.buildSessionFactory(); + try { + EntityPersister p = sf.getEntityPersister( AddressLevel.class.getName() ); + CustomType runtimeType = assertTyping( CustomType.class, p.getPropertyType( "nature" ) ); + EnumType runtimeEnumType = assertTyping( EnumType.class, runtimeType.getUserType() ); + assertEquals( Types.VARCHAR, runtimeEnumType.sqlTypes()[0] ); + } + finally { + sf.close(); + } + } + + @MappedSuperclass + public static abstract class Entity implements Serializable { + public static final String PROPERTY_NAME_ID = "id"; + @Id + @GeneratedValue(generator = "uuid2") + @GenericGenerator(name = "uuid2", strategy = "uuid2") + @Column(columnDefinition = "varchar", unique = true, nullable = false) + private String id; + + public String getId() { + return id; + } + + public void setId(final String id) { + this.id = id; + } + } + + @MappedSuperclass + public static abstract class DescriptionEntity extends Entity { + @Column(name = "description_lang1", nullable = false, length = 100) + private String descriptionLang1; + @Column(name = "description_lang2", length = 100) + private String descriptionLang2; + @Column(name = "description_lang3", length = 100) + private String descriptionLang3; + + public String getDescriptionLang1() { + return this.descriptionLang1; + } + + public void setDescriptionLang1(final String descriptionLang1) { + this.descriptionLang1 = descriptionLang1; + } + + public String getDescriptionLang2() { + return this.descriptionLang2; + } + + public void setDescriptionLang2(final String descriptionLang2) { + this.descriptionLang2 = descriptionLang2; + } + + public String getDescriptionLang3() { + return this.descriptionLang3; + } + + public void setDescriptionLang3(final String descriptionLang3) { + this.descriptionLang3 = descriptionLang3; + } + } + + public static enum Nature { + LIST, EXLIST, INPUT + } + + @javax.persistence.Entity(name = "AddressLevel") + @Table(name = "address_level") + public static class AddressLevel extends DescriptionEntity { +// @Column(columnDefinition = "varchar", nullable = false, length = 100) + @Enumerated(STRING) + private Nature nature; + @Column(nullable = false) + private Integer rank; + @Column(nullable = false) + private boolean required; + + public AddressLevel() { // Do nothing, default constructor needed by JPA / Hibernate + } + + public Nature getNature() { + return this.nature; + } + + public void setNature(final Nature nature) { + this.nature = nature; + } + + public Integer getRank() { + return this.rank; + } + + public void setRank(final Integer rank) { + this.rank = rank; + } + + public boolean getRequired() { + return this.required; + } + + public void isRequired(final boolean required) { + this.required = required; + } + } + +}