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. * Maybe it’s related to [https://hibernate.atlassian.net/browse/HHH-16670|https://hibernate.atlassian.net/browse/HHH-16670|smart-link] or [https://hibernate.atlassian.net/browse/HHH-16694|https://hibernate.atlassian.net/browse/HHH-16694|smart-link] but they say that those are occurring prior to 6.2.5. I’ve confirmed this issue is not affected until 6.2.2 (via Spring Boot 3.1.0), also 6.2.3 nor 6.2.4 (checked manually by changing {{ext['hibernate.version']}}) so it can be not related, though. |
|