The fix for [HHH-16498]([https://github.com/hibernate/hibernate-orm/pull/6539|https://github.com/hibernate/hibernate-orm/pull/6539|smart-link]) seems to be making {{columnDefinition}} value ignored.
h2. Reproducer
{code:java}package org.hibernate.orm.test.schemavalidation;
import jakarta.persistence.Column; import jakarta.persistence.Entity; import jakarta.persistence.EnumType; import jakarta.persistence.Enumerated; import jakarta.persistence.GeneratedValue; import jakarta.persistence.Id; import jakarta.persistence.Table; 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.MySQLDialect; import org.hibernate.testing.junit4.BaseCoreFunctionalTestCase; import org.hibernate.testing.orm.junit.JiraKey; import org.hibernate.testing.orm.junit.RequiresDialect; import org.hibernate.testing.transaction.TransactionUtil; import org.hibernate.tool.hbm2ddl.SchemaValidator; import org.junit.After; import org.junit.Before; import org.junit.Test;
import static jakarta.persistence.GenerationType.IDENTITY;
@JiraKey("HHH-16838") @RequiresDialect(MySQLDialect.class) public class MySqlExistingCharAsJavaEnumColumnValidationTest extends BaseCoreFunctionalTestCase {
private StandardServiceRegistry ssr;
@Override protected Class<?>[] getAnnotatedClasses() { return new Class<?>[] { EntityE.class }; }
@Before public void setUp() { TransactionUtil.doInHibernate( this::sessionFactory, session -> { session.createNativeQuery( "DROP TABLE IF EXISTS en CASCADE" ).executeUpdate(); session.createNativeQuery( "CREATE TABLE en (id INTEGER NOT NULL AUTO_INCREMENT" + ", sign_position_as_varchar varchar(20)" + ", sign_position_as_char char(20)" + ", PRIMARY KEY (id))" ) .executeUpdate(); } ); }
@After public void tearDown() { TransactionUtil.doInHibernate( this::sessionFactory, session -> { session.createNativeQuery( "DROP TABLE en CASCADE" ).executeUpdate(); } ); }
@Test public void testSynonymUsingGroupedSchemaValidator() { ssr = new StandardServiceRegistryBuilder() .applySetting( AvailableSettings.HBM2DDL_AUTO, "validate" ) .build(); try { final MetadataSources metadataSources = new MetadataSources( ssr ); metadataSources.addAnnotatedClass( EntityE.class );
new SchemaValidator().validate( metadataSources.buildMetadata() ); } finally { StandardServiceRegistryBuilder.destroy( ssr ); } }
@Entity(name = "en") @Table(name = "en") public static class EntityE { @Id @GeneratedValue(strategy = IDENTITY) @Column(name = "id", nullable = false, updatable = false) private Integer id;
@Enumerated(EnumType.STRING) @Column(name = "sign_position_as_varchar") private SignPosition signPositionAsVarchar;
@Enumerated(EnumType.STRING) @Column(name = "sign_position_as_char", columnDefinition = "char(20)") private SignPosition signPositionAsChar;
public Integer getId() { return id; }
public void setId(Integer id) { this.id = id; }
public SignPosition getSignPositionAsVarchar() { return signPositionAsVarchar; }
public void setSignPositionAsVarchar(SignPosition signPositionAsVarchar) { this.signPositionAsVarchar = signPositionAsVarchar; }
public SignPosition getSignPositionAsChar() { return signPositionAsChar; }
public void setSignPositionAsChar(SignPosition signPositionAsChar) { this.signPositionAsChar = signPositionAsChar; } }
public enum SignPosition { AFTER_NO_SPACE, AFTER_WITH_SPACE, BEFORE_NO_SPACE, BEFORE_WITH_SPACE } }{code}
h2. Expected result
Since {{signPositionAsChar}} is both declared as char(20) in the SQL query and the {{columnDefinition}}, the test should be passed.
h2. Actual result
{quote}Schema-validation: wrong column type encountered in column [sign_position_as_char] in table [en]; found [char (Types#CHAR)], but expecting [char(20) (Types#VARCHAR)]{quote}
h2. Comments
* {{ColumnDefinitions.getSqlType(Column, Metadata)}} returns {{enum ('AFTER_NO_SPACE','AFTER_WITH_SPACE','BEFORE_NO_SPACE','BEFORE_WITH_SPACE')}} and {{column.getSqlType( metadata )}} properly returns {{char(20)}}. I think there should exist a check for the pre-configured {{sqlType}}. * The message of {{SchemaManagementException}} is not matched to {{ColumnDefinitions.getSqlType(Column, Metadata)}} but since it’s a private method, {{AbstractSchemaValidator.validateColumnType}} cannot know what’s going on exactly. |
|