diff --git a/hibernate-core/src/main/java/org/hibernate/persister/entity/AbstractEntityPersister.java b/hibernate-core/src/main/java/org/hibernate/persister/entity/AbstractEntityPersister.java index 903e9b2842..6be8594bfe 100644 --- a/hibernate-core/src/main/java/org/hibernate/persister/entity/AbstractEntityPersister.java +++ b/hibernate-core/src/main/java/org/hibernate/persister/entity/AbstractEntityPersister.java @@ -359,7 +359,7 @@ public abstract class AbstractEntityPersister private final CascadeStyle[] subclassPropertyCascadeStyleClosure; //information about all columns/formulas in class hierarchy - private final String[] subclassColumnClosure; //only used by JoinedSubclassEntityPersister! TODO: MOVE IT DOWN! +// private final String[] subclassColumnClosure; // private final boolean[] subclassColumnLazyClosure; private final String[] subclassColumnAliasClosure; private final boolean[] subclassColumnSelectableClosure; @@ -705,12 +705,10 @@ public abstract class AbstractEntityPersister this.entityMetamodel = new EntityMetamodel( bootDescriptor, this, creationContext ); - if ( entityMetamodel.isMutable() ) { - this.entityEntryFactory = MutableEntityEntryFactory.INSTANCE; - } - else { - this.entityEntryFactory = ImmutableEntityEntryFactory.INSTANCE; - } + this.entityEntryFactory = entityMetamodel.isMutable() + ? MutableEntityEntryFactory.INSTANCE + : ImmutableEntityEntryFactory.INSTANCE; + // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ this.representationStrategy = creationContext.getBootstrapContext().getRepresentationStrategySelector() @@ -719,7 +717,6 @@ public abstract class AbstractEntityPersister this.javaType = representationStrategy.getLoadJavaType(); assert javaType != null; - final JdbcServices jdbcServices = factory.getServiceRegistry().getService( JdbcServices.class ); final Dialect dialect = jdbcServices.getJdbcEnvironment().getDialect(); @@ -777,12 +774,9 @@ public abstract class AbstractEntityPersister // VERSION - if ( bootDescriptor.isVersioned() ) { - versionColumnName = bootDescriptor.getVersion().getColumns().get(0).getQuotedName( dialect ); - } - else { - versionColumnName = null; - } + versionColumnName = bootDescriptor.isVersioned() + ? bootDescriptor.getVersion().getColumns().get(0).getQuotedName(dialect) + : null; //WHERE STRING @@ -846,14 +840,15 @@ public abstract class AbstractEntityPersister colAliases[k] = selectable.getAlias( dialect, prop.getValue().getTable() ); if ( selectable.isFormula() ) { foundFormula = true; - ( (Formula) selectable ).setFormula( substituteBrackets( ( (Formula) selectable ).getFormula() ) ); + Formula formula = (Formula) selectable; + formula.setFormula( substituteBrackets( formula.getFormula() ) ); formulaTemplates[k] = selectable.getTemplate( dialect, factory.getQueryEngine().getSqmFunctionRegistry() ); } else { - Column col = (Column) selectable; - colNames[k] = col.getQuotedName( dialect ); -// colReaderTemplates[k] = col.getTemplate( dialect, factory.getQueryEngine().getSqmFunctionRegistry() ); - colWriters[k] = col.getWriteExpr(); + Column column = (Column) selectable; + colNames[k] = column.getQuotedName( dialect ); +// colReaderTemplates[k] = column.getTemplate( dialect, factory.getQueryEngine().getSqmFunctionRegistry() ); + colWriters[k] = column.getWriteExpr(); } k++; } @@ -863,7 +858,7 @@ public abstract class AbstractEntityPersister propertyColumnWriters[i] = colWriters; propertyColumnAliases[i] = colAliases; - final boolean lazy = ! EnhancementHelper.includeInBaseFetchGroup( + final boolean lazy = !EnhancementHelper.includeInBaseFetchGroup( prop, entityMetamodel.isInstrumented(), entityName -> { @@ -905,7 +900,7 @@ public abstract class AbstractEntityPersister // SUBCLASS PROPERTY CLOSURE - ArrayList columns = new ArrayList<>(); +// ArrayList columns = new ArrayList<>(); // ArrayList columnsLazy = new ArrayList<>(); // ArrayList columnReaderTemplates = new ArrayList<>(); ArrayList aliases = new ArrayList<>(); @@ -968,19 +963,21 @@ public abstract class AbstractEntityPersister // formulasLazy.add( lazy ); } else { - Column col = (Column) selectable; - String colName = col.getQuotedName( dialect ); + Column column = (Column) selectable; + String colName = column.getQuotedName( dialect ); // colnos[l] = columns.size(); //before add :-) // formnos[l] = -1; - columns.add( colName ); +// columns.add( colName ); cols[l] = colName; aliases.add( selectable.getAlias( dialect, prop.getValue().getTable() ) ); // columnsLazy.add( lazy ); columnSelectables.add( prop.isSelectable() ); - readers[l] = col.getReadExpr( dialect ); - String readerTemplate = col.getTemplate( dialect, factory.getQueryEngine().getSqmFunctionRegistry() ); - readerTemplates[l] = readerTemplate; + readers[l] = column.getReadExpr( dialect ); + readerTemplates[l] = column.getTemplate( + dialect, + factory.getQueryEngine().getSqmFunctionRegistry() + ); // columnReaderTemplates.add( readerTemplate ); } l++; @@ -995,7 +992,7 @@ public abstract class AbstractEntityPersister joinedFetchesList.add( prop.getValue().getFetchMode() ); cascades.add( prop.getCascadeStyle() ); } - subclassColumnClosure = ArrayHelper.toStringArray( columns ); +// subclassColumnClosure = ArrayHelper.toStringArray( columns ); subclassColumnAliasClosure = ArrayHelper.toStringArray( aliases ); // subclassColumnLazyClosure = ArrayHelper.toBooleanArray( columnsLazy ); subclassColumnSelectableClosure = ArrayHelper.toBooleanArray( columnSelectables ); @@ -2509,11 +2506,6 @@ public abstract class AbstractEntityPersister return ArrayHelper.toIntArray( fields ); } - @Deprecated //TODO: REMOVE THIS - protected String[] getSubclassColumnClosure() { - return subclassColumnClosure; - } - protected String[] getSubclassColumnAliasClosure() { return subclassColumnAliasClosure; } diff --git a/hibernate-core/src/main/java/org/hibernate/persister/entity/JoinedSubclassEntityPersister.java b/hibernate-core/src/main/java/org/hibernate/persister/entity/JoinedSubclassEntityPersister.java index 462bd561bd..7c013b459e 100644 --- a/hibernate-core/src/main/java/org/hibernate/persister/entity/JoinedSubclassEntityPersister.java +++ b/hibernate-core/src/main/java/org/hibernate/persister/entity/JoinedSubclassEntityPersister.java @@ -21,6 +21,8 @@ import org.hibernate.HibernateException; import org.hibernate.MappingException; import org.hibernate.cache.spi.access.EntityDataAccess; import org.hibernate.cache.spi.access.NaturalIdDataAccess; +import org.hibernate.dialect.Dialect; +import org.hibernate.engine.jdbc.spi.JdbcServices; import org.hibernate.engine.spi.ExecuteUpdateResultCheckStyle; import org.hibernate.engine.spi.SessionFactoryImplementor; import org.hibernate.internal.DynamicFilterAliasGenerator; @@ -118,6 +120,7 @@ public class JoinedSubclassEntityPersister extends AbstractEntityPersister { // subclasses and superclasses of this class private final int[] subclassColumnTableNumberClosure; // private final int[] subclassFormulaTableNumberClosure; + private final String[] subclassColumnClosure; private final boolean[] subclassTableSequentialSelect; // private final boolean[] subclassTableIsLazyClosure; @@ -176,8 +179,8 @@ public class JoinedSubclassEntityPersister extends AbstractEntityPersister { } else { final Column column = (Column) selectable; - explicitDiscriminatorColumnName = column.getQuotedName(factory.getJdbcServices().getDialect()); - discriminatorAlias = column.getAlias(factory.getJdbcServices().getDialect(), persistentClass.getRootTable() ); + explicitDiscriminatorColumnName = column.getQuotedName( factory.getJdbcServices().getDialect() ); + discriminatorAlias = column.getAlias( factory.getJdbcServices().getDialect(), persistentClass.getRootTable() ); } discriminatorType = (BasicType) persistentClass.getDiscriminator().getType(); if ( persistentClass.isDiscriminatorValueNull() ) { @@ -480,9 +483,13 @@ public class JoinedSubclassEntityPersister extends AbstractEntityPersister { //TODO: code duplication with SingleTableEntityPersister + final JdbcServices jdbcServices = factory.getServiceRegistry().getService( JdbcServices.class ); + final Dialect dialect = jdbcServices.getJdbcEnvironment().getDialect(); + ArrayList columnTableNumbers = new ArrayList<>(); // ArrayList formulaTableNumbers = new ArrayList<>(); ArrayList propTableNumbers = new ArrayList<>(); + ArrayList columns = new ArrayList<>(); for ( Property property : persistentClass.getSubclassPropertyClosure() ) { Table table = property.getValue().getTable(); @@ -498,14 +505,16 @@ public class JoinedSubclassEntityPersister extends AbstractEntityPersister { } else { columnTableNumbers.add( tableNumber ); + Column column = (Column) selectable; + columns.add( column.getQuotedName( dialect ) ); } } - } subclassColumnTableNumberClosure = ArrayHelper.toIntArray( columnTableNumbers ); subclassPropertyTableNumberClosure = ArrayHelper.toIntArray( propTableNumbers ); // subclassFormulaTableNumberClosure = ArrayHelper.toIntArray( formulaTableNumbers ); + subclassColumnClosure = ArrayHelper.toStringArray( columns ); // SUBCLASSES @@ -596,9 +605,7 @@ public class JoinedSubclassEntityPersister extends AbstractEntityPersister { initDiscriminatorProperties( factory, k, table, discriminatorValue ); subclassesByDiscriminatorValue.put( discriminatorValue, subclass.getEntityName() ); int id = getTableId( - table.getQualifiedName( - factory.getSqlStringGenerationContext() - ), + table.getQualifiedName( factory.getSqlStringGenerationContext() ), subclassTableNameClosure ); notNullColumnTableNumbers[k] = id; @@ -673,7 +680,9 @@ public class JoinedSubclassEntityPersister extends AbstractEntityPersister { * * @return subclassNamesBySubclassTable */ - private String[][] buildSubclassNamesBySubclassTableMapping(PersistentClass persistentClass, SessionFactoryImplementor factory) { + private String[][] buildSubclassNamesBySubclassTableMapping( + PersistentClass persistentClass, + SessionFactoryImplementor factory) { // this value represents the number of subclasses (and not the class itself) final int numberOfSubclassTables = subclassTableNameClosure.length - coreTableSpan; if ( numberOfSubclassTables == 0 ) { @@ -1107,18 +1116,17 @@ public class JoinedSubclassEntityPersister extends AbstractEntityPersister { return naturalOrderPropertyTableNumbers[i]; } } - - final String[] subclassColumnNameClosure = getSubclassColumnClosure(); - for ( int i = 0, max = subclassColumnNameClosure.length; i < max; i++ ) { - final boolean quoted = subclassColumnNameClosure[i].startsWith( "\"" ) - && subclassColumnNameClosure[i].endsWith( "\"" ); + + for (int i = 0, max = subclassColumnClosure.length; i < max; i++ ) { + final boolean quoted = subclassColumnClosure[i].startsWith( "\"" ) + && subclassColumnClosure[i].endsWith( "\"" ); if ( quoted ) { - if ( subclassColumnNameClosure[i].equals( columnName ) ) { + if ( subclassColumnClosure[i].equals( columnName ) ) { return subclassColumnTableNumberClosure[i]; } } else { - if ( subclassColumnNameClosure[i].equalsIgnoreCase( columnName ) ) { + if ( subclassColumnClosure[i].equalsIgnoreCase( columnName ) ) { return subclassColumnTableNumberClosure[i]; } }