Skip to content

Commit 9e1acba

Browse files
gbadnersebersole
authored andcommitted
HHH-8276 - Integrate LoadPlans into UniqueEntityLoader (PoC)
1 parent c607e30 commit 9e1acba

File tree

3 files changed

+23
-8
lines changed

3 files changed

+23
-8
lines changed

hibernate-core/src/main/java/org/hibernate/loader/plan2/build/internal/returns/AbstractCollectionReference.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
import org.hibernate.loader.plan2.spi.CollectionFetchableElement;
3030
import org.hibernate.loader.plan2.spi.CollectionFetchableIndex;
3131
import org.hibernate.loader.plan2.spi.CollectionReference;
32+
import org.hibernate.loader.plan2.spi.FetchSource;
3233
import org.hibernate.loader.plan2.spi.Join;
3334
import org.hibernate.persister.collection.CollectionPersister;
3435
import org.hibernate.persister.entity.EntityPersister;

hibernate-core/src/main/java/org/hibernate/loader/plan2/build/spi/AbstractLoadPlanBuildingAssociationVisitationStrategy.java

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -584,28 +584,32 @@ public void foundCircularAssociation(AssociationAttributeDefinition attributeDef
584584
return; // nothing to do
585585
}
586586

587+
final AssociationKey associationKey = attributeDefinition.getAssociationKey();
588+
587589
// go ahead and build the bidirectional fetch
588590
if ( attributeDefinition.getAssociationNature() == AssociationAttributeDefinition.AssociationNature.ENTITY ) {
589591
final Joinable currentEntityPersister = (Joinable) currentSource().resolveEntityReference().getEntityPersister();
590592
final AssociationKey currentEntityReferenceAssociationKey =
591593
new AssociationKey( currentEntityPersister.getTableName(), currentEntityPersister.getKeyColumnNames() );
592-
final Joinable fetchSourceEntityPersister =
593-
(Joinable) registeredFetchSource( attributeDefinition.getAssociationKey() ).resolveEntityReference().getEntityPersister();
594-
final AssociationKey fetchSourceEntityReferenceAssociationKey =
595-
new AssociationKey( fetchSourceEntityPersister.getTableName(), fetchSourceEntityPersister.getKeyColumnNames() );
596-
if ( ! attributeDefinition.getAssociationKey().equals( currentEntityReferenceAssociationKey ) &&
597-
! attributeDefinition.getAssociationKey().equals( fetchSourceEntityReferenceAssociationKey ) ) {
594+
// if associationKey is equal to currentEntityReferenceAssociationKey
595+
// that means that the current EntityPersister has a single primary key attribute
596+
// (i.e., derived attribute) which is mapped by attributeDefinition.
597+
// This is not a bidirectional association.
598+
// TODO: AFAICT, to avoid an overflow, the associated entity must already be loaded into the session, or
599+
// it must be loaded when the ID for the dependent entity is resolved. Is there some other way to
600+
// deal with this???
601+
if ( ! associationKey.equals( currentEntityReferenceAssociationKey ) ) {
598602
currentSource().buildBidirectionalEntityFetch(
599603
attributeDefinition,
600604
fetchStrategy,
601-
fetchedAssociationKeySourceMap.get( attributeDefinition.getAssociationKey() ).resolveEntityReference(),
605+
registeredFetchSource( associationKey ).resolveEntityReference(),
602606
this
603607
);
604608
}
605609
}
606610
else {
607611
// Collection
608-
currentSource().buildCollectionFetch( attributeDefinition, fetchStrategy, this );
612+
//currentSource().buildCollectionFetch( attributeDefinition, fetchStrategy, this );
609613
}
610614
}
611615

hibernate-core/src/main/java/org/hibernate/persister/walking/spi/MetamodelGraphWalker.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
import org.hibernate.engine.spi.SessionFactoryImplementor;
3232
import org.hibernate.loader.PropertyPath;
3333
import org.hibernate.persister.collection.CollectionPersister;
34+
import org.hibernate.persister.collection.QueryableCollection;
3435
import org.hibernate.persister.entity.EntityPersister;
3536
import org.hibernate.type.Type;
3637

@@ -261,6 +262,15 @@ private void visitCollectionElements(CollectionDefinition collectionDefinition)
261262
visitAttributes( elementDefinition.toCompositeElementDefinition() );
262263
}
263264
else if ( elementDefinition.getType().isEntityType() ) {
265+
if ( ! collectionDefinition.getCollectionPersister().isOneToMany() ) {
266+
final QueryableCollection queryableCollection = (QueryableCollection) collectionDefinition.getCollectionPersister();
267+
addAssociationKey(
268+
new AssociationKey(
269+
queryableCollection.getTableName(),
270+
queryableCollection.getElementColumnNames()
271+
)
272+
);
273+
}
264274
visitEntityDefinition( elementDefinition.toEntityDefinition() );
265275
}
266276

0 commit comments

Comments
 (0)