Skip to content

Commit

Permalink
HHH-16560 Nested @Embedded within an @EmbeddedId assertion failure
Browse files Browse the repository at this point in the history
  • Loading branch information
dreab8 committed May 29, 2023
1 parent f8a31c1 commit 3950509
Showing 1 changed file with 14 additions and 1 deletion.
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
import org.hibernate.metamodel.mapping.EntityIdentifierMapping;
import org.hibernate.metamodel.mapping.ForeignKeyDescriptor;
import org.hibernate.metamodel.mapping.VirtualModelPart;
import org.hibernate.metamodel.model.domain.NavigableRole;
import org.hibernate.metamodel.spi.ValueAccess;
import org.hibernate.property.access.spi.PropertyAccess;
import org.hibernate.proxy.HibernateProxy;
Expand Down Expand Up @@ -66,21 +67,33 @@ public AbstractEmbeddableInitializer(
final int size = embeddableTypeDescriptor.getNumberOfFetchables();
this.rowState = new Object[ size ];

this.isPartOfKey = isPartOfKey( navigablePath );
this.isPartOfKey = isPartOfKey( embedded, navigablePath );
// We never want to create empty composites for the FK target or PK, otherwise collections would break
this.createEmptyCompositesEnabled = !isPartOfKey && embeddableTypeDescriptor.isCreateEmptyCompositesEnabled();

this.sessionFactory = creationState.getSqlAstCreationContext().getSessionFactory();
this.assemblers = createAssemblers( resultDescriptor, creationState, embeddableTypeDescriptor );
}

private static boolean isPartOfKey(EmbeddableValuedModelPart modelPart, NavigablePath navigablePath) {
return modelPart.isEntityIdentifierMapping()
|| isPartOfKey( navigablePath )
|| modelPart.getNavigableRole() != null && isPartOfKey( modelPart.getNavigableRole() );
}

private static boolean isPartOfKey(NavigablePath navigablePath) {
return ForeignKeyDescriptor.PART_NAME.equals( navigablePath.getLocalName() )
|| ForeignKeyDescriptor.TARGET_PART_NAME.equals( navigablePath.getLocalName() )
|| navigablePath instanceof EntityIdentifierNavigablePath
|| navigablePath.getParent().getParent() != null && isPartOfKey( navigablePath.getParent() );
}

private static boolean isPartOfKey(NavigableRole navigableRole) {
final NavigableRole parent = navigableRole.getParent();
return parent != null
&& ( parent.getLocalName().equals( EntityIdentifierMapping.ROLE_LOCAL_NAME ) || isPartOfKey( parent ) );
}

protected DomainResultAssembler<?>[] createAssemblers(
EmbeddableResultGraphNode resultDescriptor,
AssemblerCreationState creationState,
Expand Down

0 comments on commit 3950509

Please sign in to comment.