Skip to content

Commit 287be61

Browse files
committed
Backport some fixes that were part of HHH-17818, that are needed to make other backports work
1 parent 6706784 commit 287be61

File tree

5 files changed

+36
-10
lines changed

5 files changed

+36
-10
lines changed

hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/CaseStatementDiscriminatorMappingImpl.java

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
import org.hibernate.engine.FetchTiming;
1212
import org.hibernate.engine.spi.SessionFactoryImplementor;
1313
import org.hibernate.metamodel.mapping.DiscriminatorType;
14+
import org.hibernate.metamodel.mapping.EntityMappingType;
1415
import org.hibernate.metamodel.mapping.JdbcMapping;
1516
import org.hibernate.metamodel.mapping.JdbcMappingContainer;
1617
import org.hibernate.persister.entity.JoinedSubclassEntityPersister;
@@ -88,18 +89,23 @@ public BasicFetch<?> generateFetch(
8889
final TableGroup tableGroup = sqlAstCreationState.getFromClauseAccess().getTableGroup(
8990
fetchParent.getNavigablePath()
9091
);
91-
// Since the expression is lazy, based on the available table reference joins,
92-
// we need to force the initialization in case this is a fetch
93-
tableDiscriminatorDetailsMap.forEach(
94-
(tableName, tableDiscriminatorDetails) -> tableGroup.getTableReference(
95-
fetchablePath,
96-
tableName,
97-
true
98-
)
99-
);
92+
resolveSubTypeTableReferences( tableGroup, fetchablePath );
10093
return super.generateFetch( fetchParent, fetchablePath, fetchTiming, selected, resultVariable, creationState );
10194
}
10295

96+
private void resolveSubTypeTableReferences(TableGroup tableGroup, NavigablePath navigablePath) {
97+
final EntityMappingType entityDescriptor = (EntityMappingType) tableGroup.getModelPart().getPartMappingType();
98+
// Since the expression is lazy, based on the available table reference joins,
99+
// we need to force the initialization in case this is selected
100+
for ( EntityMappingType subMappingType : entityDescriptor.getSubMappingTypes() ) {
101+
tableGroup.getTableReference(
102+
navigablePath,
103+
subMappingType.getMappedTableDetails().getTableName(),
104+
true
105+
);
106+
}
107+
}
108+
103109
@Override
104110
public Expression resolveSqlExpression(
105111
NavigablePath navigablePath,

hibernate-core/src/main/java/org/hibernate/metamodel/model/domain/internal/MappingMetamodelImpl.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -205,6 +205,10 @@ public void finishInitialization(RuntimeModelCreationContext context) {
205205
registerEntityNameResolvers( persister, entityNameResolvers );
206206
}
207207

208+
for ( EntityPersister persister : entityPersisterMap.values() ) {
209+
persister.prepareLoaders();
210+
}
211+
208212
collectionPersisterMap.values().forEach( CollectionPersister::postInstantiate );
209213

210214
registerEmbeddableMappingType( bootModel );

hibernate-core/src/main/java/org/hibernate/persister/entity/AbstractEntityPersister.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3591,6 +3591,10 @@ protected String substituteBrackets(String sql) {
35913591
@Override
35923592
public final void postInstantiate() throws MappingException {
35933593
doLateInit();
3594+
}
3595+
3596+
@Override
3597+
public void prepareLoaders() {
35943598
prepareLoader( singleIdLoader );
35953599
prepareLoader( multiIdLoader );
35963600
}

hibernate-core/src/main/java/org/hibernate/persister/entity/EntityPersister.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,17 @@ public interface EntityPersister extends EntityMappingType, RootTableGroupProduc
119119
*/
120120
void postInstantiate() throws MappingException;
121121

122+
/**
123+
* Prepare loaders associated with the persister. Distinct "phase"
124+
* in building the persister after {@linkplain InFlightEntityMappingType#prepareMappingModel}
125+
* and {@linkplain #postInstantiate()} have occurred.
126+
* <p/>
127+
* The distinct phase is used to ensure that all {@linkplain org.hibernate.metamodel.mapping.TableDetails}
128+
* are available across the entire model
129+
*/
130+
default void prepareLoaders() {
131+
}
132+
122133
/**
123134
* Return the {@link org.hibernate.SessionFactory} to which this persister
124135
* belongs.

hibernate-core/src/main/java/org/hibernate/persister/entity/JoinedSubclassEntityPersister.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1273,7 +1273,8 @@ public FilterAliasGenerator getFilterAliasGenerator(String rootAlias) {
12731273

12741274
@Override
12751275
public TableDetails getMappedTableDetails() {
1276-
return getTableMapping( getTableMappings().length - 1 );
1276+
// Subtract the number of secondary tables (tableSpan - coreTableSpan) and get the last table mapping
1277+
return getTableMapping( getTableMappings().length - ( tableSpan - coreTableSpan ) - 1 );
12771278
}
12781279

12791280
@Override

0 commit comments

Comments
 (0)