From 1e5d64cf7944c6a4262c5a9408c6c9442ff585a2 Mon Sep 17 00:00:00 2001 From: Nathan Xu Date: Thu, 14 Jan 2021 22:43:56 -0500 Subject: [PATCH] HHH-14407 NPE in Column.getSqlTypeCode(Mapping mapping) for column 'hib_sess_id' when using PersistentTableBulkIdStrategy --- .../AbstractMultiTableBulkIdStrategyImpl.java | 6 +- .../PersistentTableBulkIdStrategy.java | 3 + .../hibernate/id/hhh14407/ChildEntity.java | 23 ++++++++ .../hibernate/id/hhh14407/ParentEntity.java | 34 +++++++++++ .../PersistentTableBulkIdStrategyNPETest.java | 58 +++++++++++++++++++ 5 files changed, 121 insertions(+), 3 deletions(-) create mode 100644 hibernate-core/src/test/java/org/hibernate/id/hhh14407/ChildEntity.java create mode 100644 hibernate-core/src/test/java/org/hibernate/id/hhh14407/ParentEntity.java create mode 100644 hibernate-core/src/test/java/org/hibernate/id/hhh14407/PersistentTableBulkIdStrategyNPETest.java diff --git a/hibernate-core/src/main/java/org/hibernate/hql/spi/id/AbstractMultiTableBulkIdStrategyImpl.java b/hibernate-core/src/main/java/org/hibernate/hql/spi/id/AbstractMultiTableBulkIdStrategyImpl.java index 3b7fa3c7b4..930da89d34 100644 --- a/hibernate-core/src/main/java/org/hibernate/hql/spi/id/AbstractMultiTableBulkIdStrategyImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/hql/spi/id/AbstractMultiTableBulkIdStrategyImpl.java @@ -137,13 +137,13 @@ protected String buildIdTableCreateStatement(Table idTable, JdbcServices jdbcSer .append( jdbcEnvironment.getQualifiedObjectNameFormatter().format( idTable.getQualifiedTableName(), dialect ) ) .append( " (" ); - Iterator itr = idTable.getColumnIterator(); + Iterator itr = idTable.getColumnIterator(); while ( itr.hasNext() ) { - final Column column = (Column) itr.next(); + final Column column = itr.next(); buffer.append( column.getQuotedName( dialect ) ).append( ' ' ); buffer.append( column.getSqlType( dialect, metadata ) ); - final int sqlTypeCode = column.getSqlTypeCode( metadata ); + final int sqlTypeCode = column.getSqlTypeCode() != null ? column.getSqlTypeCode() : column.getSqlTypeCode( metadata ); final String columnAnnotation = dialect.getCreateTemporaryTableColumnAnnotation( sqlTypeCode ); if ( !columnAnnotation.isEmpty() ) { buffer.append(" ").append( columnAnnotation ); diff --git a/hibernate-core/src/main/java/org/hibernate/hql/spi/id/persistent/PersistentTableBulkIdStrategy.java b/hibernate-core/src/main/java/org/hibernate/hql/spi/id/persistent/PersistentTableBulkIdStrategy.java index bfc7b2da18..04c2cf0c04 100644 --- a/hibernate-core/src/main/java/org/hibernate/hql/spi/id/persistent/PersistentTableBulkIdStrategy.java +++ b/hibernate-core/src/main/java/org/hibernate/hql/spi/id/persistent/PersistentTableBulkIdStrategy.java @@ -6,6 +6,8 @@ */ package org.hibernate.hql.spi.id.persistent; +import java.sql.Types; + import org.hibernate.boot.model.naming.Identifier; import org.hibernate.boot.model.relational.QualifiedTableName; import org.hibernate.boot.registry.StandardServiceRegistry; @@ -111,6 +113,7 @@ protected QualifiedTableName determineIdTableName( protected void augmentIdTableDefinition(Table idTable) { Column sessionIdColumn = new Column( Helper.SESSION_ID_COLUMN_NAME ); sessionIdColumn.setSqlType( "CHAR(36)" ); + sessionIdColumn.setSqlTypeCode( Types.VARCHAR ); sessionIdColumn.setComment( "Used to hold the Hibernate Session identifier" ); idTable.addColumn( sessionIdColumn ); } diff --git a/hibernate-core/src/test/java/org/hibernate/id/hhh14407/ChildEntity.java b/hibernate-core/src/test/java/org/hibernate/id/hhh14407/ChildEntity.java new file mode 100644 index 0000000000..89c549ddcf --- /dev/null +++ b/hibernate-core/src/test/java/org/hibernate/id/hhh14407/ChildEntity.java @@ -0,0 +1,23 @@ +/* + * 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.id.hhh14407; + +import javax.persistence.Basic; +import javax.persistence.Column; +import javax.persistence.Entity; + +/** + * @author Sönke Reimer + */ +@Entity(name="ChildEntity") +class ChildEntity extends ParentEntity { + + @Basic + @Column(name="CHILD") + private String ivChild; + +} diff --git a/hibernate-core/src/test/java/org/hibernate/id/hhh14407/ParentEntity.java b/hibernate-core/src/test/java/org/hibernate/id/hhh14407/ParentEntity.java new file mode 100644 index 0000000000..b95da7ca48 --- /dev/null +++ b/hibernate-core/src/test/java/org/hibernate/id/hhh14407/ParentEntity.java @@ -0,0 +1,34 @@ +/* + * 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.id.hhh14407; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.Id; +import javax.persistence.Inheritance; +import javax.persistence.InheritanceType; +import javax.persistence.Version; + +/** + * @author Sönke Reimer + */ +@Entity(name="ParentEntity") +@Inheritance(strategy=InheritanceType.TABLE_PER_CLASS) +class ParentEntity { + + @Id + @Column(name = "ID", length = 32) + private String Id; + + @Version + @Column(name = "LOCK_VERSION") + private int Lock_Version; + public String getId() { + return Id; + } + +} diff --git a/hibernate-core/src/test/java/org/hibernate/id/hhh14407/PersistentTableBulkIdStrategyNPETest.java b/hibernate-core/src/test/java/org/hibernate/id/hhh14407/PersistentTableBulkIdStrategyNPETest.java new file mode 100644 index 0000000000..85a2a64095 --- /dev/null +++ b/hibernate-core/src/test/java/org/hibernate/id/hhh14407/PersistentTableBulkIdStrategyNPETest.java @@ -0,0 +1,58 @@ +/* + * 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.id.hhh14407; + +import org.hibernate.cfg.Configuration; +import org.hibernate.cfg.Environment; +import org.hibernate.dialect.H2Dialect; +import org.hibernate.hql.spi.id.MultiTableBulkIdStrategy; +import org.hibernate.hql.spi.id.persistent.PersistentTableBulkIdStrategy; + +import org.hibernate.testing.RequiresDialect; +import org.hibernate.testing.TestForIssue; +import org.hibernate.testing.junit4.BaseCoreFunctionalTestCase; +import org.junit.Test; + +/** + * @author Nathan Xu + * @author Sönke Reimer + */ +@RequiresDialect( value = H2Dialect.class ) +@TestForIssue( jiraKey = "HHH14407" ) +public class PersistentTableBulkIdStrategyNPETest extends BaseCoreFunctionalTestCase { + + @Override + protected void configure(Configuration configuration) { + configuration.setProperty( + Environment.DIALECT, + PersistentTableBulkIdH2Dialect.class.getName() + ); + } + + @Override + protected Class[] getAnnotatedClasses() { + return new Class[] { + ParentEntity.class, + ChildEntity.class + }; + } + + @Test + public void hhh14407Test() { + // without fix of HHH14407, the test case will trigger exception due to NPE in PersistentTableBulkIdStrategy + } + + public static class PersistentTableBulkIdH2Dialect extends H2Dialect { + + @Override + public MultiTableBulkIdStrategy getDefaultMultiTableBulkIdStrategy() { + return new PersistentTableBulkIdStrategy(); + } + + } + +}