HHH-8276 - Integrate LoadPlans into UniqueEntityLoader (PoC)
This commit is contained in:
parent
9e1acbac41
commit
1e79efd10a
|
@ -158,18 +158,18 @@ public abstract class AbstractCompositeFetch implements CompositeFetch, Expandin
|
||||||
final ExpandingQuerySpace leftHandSide = (ExpandingQuerySpace) resolveCompositeQuerySpace(
|
final ExpandingQuerySpace leftHandSide = (ExpandingQuerySpace) resolveCompositeQuerySpace(
|
||||||
loadPlanBuildingContext
|
loadPlanBuildingContext
|
||||||
);
|
);
|
||||||
final Join join = leftHandSide.addEntityJoin(
|
|
||||||
attributeDefinition,
|
|
||||||
fetchedPersister,
|
|
||||||
loadPlanBuildingContext.getQuerySpaces().generateImplicitUid(),
|
|
||||||
attributeDefinition.isNullable()
|
|
||||||
);
|
|
||||||
final EntityFetch fetch;
|
final EntityFetch fetch;
|
||||||
if ( targetEntityReference == null ) {
|
if ( targetEntityReference == null ) {
|
||||||
|
final Join join = leftHandSide.addEntityJoin(
|
||||||
|
attributeDefinition,
|
||||||
|
fetchedPersister,
|
||||||
|
loadPlanBuildingContext.getQuerySpaces().generateImplicitUid(),
|
||||||
|
attributeDefinition.isNullable()
|
||||||
|
);
|
||||||
fetch = new EntityFetchImpl( this, attributeDefinition, fetchStrategy, join );
|
fetch = new EntityFetchImpl( this, attributeDefinition, fetchStrategy, join );
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
fetch = new BidirectionalEntityFetchImpl( this, attributeDefinition, fetchStrategy, join, targetEntityReference );
|
fetch = new BidirectionalEntityFetchImpl( this, attributeDefinition, fetchStrategy, targetEntityReference );
|
||||||
}
|
}
|
||||||
addFetch( fetch );
|
addFetch( fetch );
|
||||||
return fetch;
|
return fetch;
|
||||||
|
|
|
@ -192,18 +192,18 @@ public abstract class AbstractEntityReference implements EntityReference, Expand
|
||||||
}
|
}
|
||||||
|
|
||||||
final ExpandingQuerySpace leftHandSide = (ExpandingQuerySpace) entityQuerySpace;
|
final ExpandingQuerySpace leftHandSide = (ExpandingQuerySpace) entityQuerySpace;
|
||||||
final Join join = leftHandSide.addEntityJoin(
|
|
||||||
attributeDefinition,
|
|
||||||
fetchedPersister,
|
|
||||||
loadPlanBuildingContext.getQuerySpaces().generateImplicitUid(),
|
|
||||||
attributeDefinition.isNullable()
|
|
||||||
);
|
|
||||||
final EntityFetch fetch;
|
final EntityFetch fetch;
|
||||||
if ( targetEntityReference == null ) {
|
if ( targetEntityReference == null ) {
|
||||||
|
final Join join = leftHandSide.addEntityJoin(
|
||||||
|
attributeDefinition,
|
||||||
|
fetchedPersister,
|
||||||
|
loadPlanBuildingContext.getQuerySpaces().generateImplicitUid(),
|
||||||
|
attributeDefinition.isNullable()
|
||||||
|
);
|
||||||
fetch = new EntityFetchImpl( this, attributeDefinition, fetchStrategy, join );
|
fetch = new EntityFetchImpl( this, attributeDefinition, fetchStrategy, join );
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
fetch = new BidirectionalEntityFetchImpl( this, attributeDefinition, fetchStrategy, join, targetEntityReference );
|
fetch = new BidirectionalEntityFetchImpl( this, attributeDefinition, fetchStrategy, targetEntityReference );
|
||||||
}
|
}
|
||||||
addFetch( fetch );
|
addFetch( fetch );
|
||||||
return fetch;
|
return fetch;
|
||||||
|
|
|
@ -24,11 +24,17 @@
|
||||||
package org.hibernate.loader.plan2.build.internal.returns;
|
package org.hibernate.loader.plan2.build.internal.returns;
|
||||||
|
|
||||||
import org.hibernate.engine.FetchStrategy;
|
import org.hibernate.engine.FetchStrategy;
|
||||||
|
import org.hibernate.loader.PropertyPath;
|
||||||
import org.hibernate.loader.plan2.build.spi.ExpandingFetchSource;
|
import org.hibernate.loader.plan2.build.spi.ExpandingFetchSource;
|
||||||
import org.hibernate.loader.plan2.spi.BidirectionalEntityFetch;
|
import org.hibernate.loader.plan2.spi.BidirectionalEntityFetch;
|
||||||
|
import org.hibernate.loader.plan2.spi.EntityFetch;
|
||||||
|
import org.hibernate.loader.plan2.spi.EntityIdentifierDescription;
|
||||||
import org.hibernate.loader.plan2.spi.EntityReference;
|
import org.hibernate.loader.plan2.spi.EntityReference;
|
||||||
import org.hibernate.loader.plan2.spi.Join;
|
import org.hibernate.loader.plan2.spi.Fetch;
|
||||||
|
import org.hibernate.loader.plan2.spi.FetchSource;
|
||||||
|
import org.hibernate.persister.entity.EntityPersister;
|
||||||
import org.hibernate.persister.walking.spi.AssociationAttributeDefinition;
|
import org.hibernate.persister.walking.spi.AssociationAttributeDefinition;
|
||||||
|
import org.hibernate.type.EntityType;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Represents an entity fetch that is bi-directionally join fetched.
|
* Represents an entity fetch that is bi-directionally join fetched.
|
||||||
|
@ -39,20 +45,86 @@ import org.hibernate.persister.walking.spi.AssociationAttributeDefinition;
|
||||||
*
|
*
|
||||||
* @author Steve Ebersole
|
* @author Steve Ebersole
|
||||||
*/
|
*/
|
||||||
public class BidirectionalEntityFetchImpl extends EntityFetchImpl implements BidirectionalEntityFetch {
|
public class BidirectionalEntityFetchImpl implements BidirectionalEntityFetch, EntityFetch {
|
||||||
|
private final ExpandingFetchSource fetchSource;
|
||||||
|
private final AssociationAttributeDefinition fetchedAttribute;
|
||||||
|
private final FetchStrategy fetchStrategy;
|
||||||
private final EntityReference targetEntityReference;
|
private final EntityReference targetEntityReference;
|
||||||
|
private final PropertyPath propertyPath;
|
||||||
|
|
||||||
public BidirectionalEntityFetchImpl(
|
public BidirectionalEntityFetchImpl(
|
||||||
ExpandingFetchSource fetchSource,
|
ExpandingFetchSource fetchSource,
|
||||||
AssociationAttributeDefinition fetchedAttribute,
|
AssociationAttributeDefinition fetchedAttribute,
|
||||||
FetchStrategy fetchStrategy,
|
FetchStrategy fetchStrategy,
|
||||||
Join fetchedJoin,
|
|
||||||
EntityReference targetEntityReference) {
|
EntityReference targetEntityReference) {
|
||||||
super( fetchSource, fetchedAttribute, fetchStrategy, fetchedJoin );
|
this.fetchSource = fetchSource;
|
||||||
|
this.fetchedAttribute = fetchedAttribute;
|
||||||
|
this.fetchStrategy = fetchStrategy;
|
||||||
this.targetEntityReference = targetEntityReference;
|
this.targetEntityReference = targetEntityReference;
|
||||||
|
this.propertyPath = fetchSource.getPropertyPath().append( fetchedAttribute.getName() );
|
||||||
}
|
}
|
||||||
|
|
||||||
public EntityReference getTargetEntityReference() {
|
public EntityReference getTargetEntityReference() {
|
||||||
return targetEntityReference;
|
return targetEntityReference;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public FetchSource getSource() {
|
||||||
|
return fetchSource;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public PropertyPath getPropertyPath() {
|
||||||
|
return propertyPath;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public FetchStrategy getFetchStrategy() {
|
||||||
|
return fetchStrategy;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public EntityType getFetchedType() {
|
||||||
|
return (EntityType) fetchedAttribute.getType();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isNullable() {
|
||||||
|
return fetchedAttribute.isNullable();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getAdditionalJoinConditions() {
|
||||||
|
return null; //To change body of implemented methods use File | Settings | File Templates.
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String[] toSqlSelectFragments(String alias) {
|
||||||
|
return new String[0]; //To change body of implemented methods use File | Settings | File Templates.
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getQuerySpaceUid() {
|
||||||
|
return targetEntityReference.getQuerySpaceUid();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Fetch[] getFetches() {
|
||||||
|
return FetchSource.NO_FETCHES;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public EntityReference resolveEntityReference() {
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public EntityPersister getEntityPersister() {
|
||||||
|
return targetEntityReference.getEntityPersister();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public EntityIdentifierDescription getIdentifierDescription() {
|
||||||
|
return targetEntityReference.getIdentifierDescription();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -27,6 +27,7 @@ import java.io.ByteArrayOutputStream;
|
||||||
import java.io.PrintStream;
|
import java.io.PrintStream;
|
||||||
import java.io.PrintWriter;
|
import java.io.PrintWriter;
|
||||||
|
|
||||||
|
import org.hibernate.loader.plan2.spi.BidirectionalEntityFetch;
|
||||||
import org.hibernate.loader.plan2.spi.CollectionFetch;
|
import org.hibernate.loader.plan2.spi.CollectionFetch;
|
||||||
import org.hibernate.loader.plan2.spi.CollectionFetchableElement;
|
import org.hibernate.loader.plan2.spi.CollectionFetchableElement;
|
||||||
import org.hibernate.loader.plan2.spi.CollectionFetchableIndex;
|
import org.hibernate.loader.plan2.spi.CollectionFetchableIndex;
|
||||||
|
@ -152,6 +153,9 @@ public class ReturnGraphTreePrinter {
|
||||||
}
|
}
|
||||||
|
|
||||||
private void writeEntityReferenceFetches(EntityReference entityReference, int depth, PrintWriter printWriter) {
|
private void writeEntityReferenceFetches(EntityReference entityReference, int depth, PrintWriter printWriter) {
|
||||||
|
if ( BidirectionalEntityFetch.class.isInstance( entityReference ) ) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
if ( entityReference.getIdentifierDescription().hasFetches() ) {
|
if ( entityReference.getIdentifierDescription().hasFetches() ) {
|
||||||
printWriter.println( TreePrinterHelper.INSTANCE.generateNodePrefix( depth ) + "(entity id) " );
|
printWriter.println( TreePrinterHelper.INSTANCE.generateNodePrefix( depth ) + "(entity id) " );
|
||||||
writeFetches( ( (FetchSource) entityReference.getIdentifierDescription() ).getFetches(), depth+1, printWriter );
|
writeFetches( ( (FetchSource) entityReference.getIdentifierDescription() ).getFetches(), depth+1, printWriter );
|
||||||
|
|
Loading…
Reference in New Issue