99import java .lang .reflect .Method ;
1010import java .lang .reflect .ParameterizedType ;
1111import java .util .HashMap ;
12+ import java .util .Set ;
1213
1314import org .hibernate .AssertionFailure ;
1415import org .hibernate .PropertyNotFoundException ;
@@ -395,20 +396,29 @@ private static JavaType<?> determineRelationalJavaType(
395396 private static EntityPersister getDeclaringEntity (
396397 AbstractIdentifiableType <?> ownerType ,
397398 MetadataContext metadataContext ) {
399+ final java .util .List <EntityPersister > resultList = getDeclarerEntityPersister ( ownerType , metadataContext );
400+ return resultList .isEmpty () ? null : resultList .getFirst ();
401+ }
402+
403+ private static java .util .List <EntityPersister > getAllDeclaringEntities (AbstractIdentifiableType <?> ownerType ,
404+ MetadataContext metadataContext ) {
398405 return getDeclarerEntityPersister ( ownerType , metadataContext );
399406 }
400407
401- private static EntityPersister getDeclarerEntityPersister (
408+ private static java . util . List < EntityPersister > getDeclarerEntityPersister (
402409 AbstractIdentifiableType <?> ownerType ,
403410 MetadataContext metadataContext ) {
404411 final Type .PersistenceType persistenceType = ownerType .getPersistenceType ();
405412 if ( persistenceType == Type .PersistenceType .ENTITY ) {
406- return metadataContext .getMetamodel ().getEntityDescriptor ( ownerType .getTypeName () );
413+ return java . util . List . of ( metadataContext .getMetamodel ().getEntityDescriptor ( ownerType .getTypeName () ) );
407414 }
408415 else if ( persistenceType == Type .PersistenceType .MAPPED_SUPERCLASS ) {
409- final PersistentClass persistentClass =
416+ final Set < PersistentClass > persistentClassSet =
410417 metadataContext .getPersistentClassHostingProperties ( (MappedSuperclassTypeImpl <?>) ownerType );
411- return persistentClass != null ? metadataContext .getMetamodel ().findEntityDescriptor ( persistentClass .getClassName () ) : null ;
418+ if (persistentClassSet == null ) {
419+ return java .util .List .of ();
420+ }
421+ return persistentClassSet .stream ().map ( persistentClass -> metadataContext .getMetamodel ().findEntityDescriptor ( persistentClass .getClassName () ) ).toList ();
412422 }
413423 else {
414424 throw new AssertionFailure ( "Cannot get the metamodel for PersistenceType: " + persistenceType );
@@ -680,18 +690,27 @@ private static EmbeddableRepresentationStrategy ownerRepresentationStrategy(
680690
681691 private static final MemberResolver virtualIdentifierMemberResolver = (attributeContext , metadataContext ) -> {
682692 final AbstractIdentifiableType <?> identifiableType = (AbstractIdentifiableType <?>) attributeContext .getOwnerType ();
683- final EntityPersister declaringEntity = getDeclaringEntity ( identifiableType , metadataContext );
684- return resolveVirtualIdentifierMember ( attributeContext .getPropertyMapping (), declaringEntity );
693+ final java . util . List < EntityPersister > declaringEntities = getAllDeclaringEntities ( identifiableType , metadataContext );
694+ return resolveVirtualIdentifierMember ( attributeContext .getPropertyMapping (), declaringEntities );
685695 };
686696
687- private static Member resolveVirtualIdentifierMember ( Property property , EntityPersister entityPersister ) {
688- final EntityIdentifierMapping identifierMapping = entityPersister .getIdentifierMapping ();
697+ private static Member resolveVirtualIdentifierMember ( Property property , java .util .List <EntityPersister > entityPersisters ) {
698+ CompositeIdentifierMapping cid = null ;
699+
700+ // HHH-19076: Find the first EntityPersister for the property with a VIRTUAL identifierMapping
701+ for (EntityPersister entityPersister : entityPersisters ) {
702+ EntityIdentifierMapping identifierMapping = entityPersister .getIdentifierMapping ();
703+
704+ if ( identifierMapping .getNature () == EntityIdentifierMapping .Nature .VIRTUAL ) {
705+ cid = (CompositeIdentifierMapping ) identifierMapping ;
706+ break ;
707+ }
708+ }
689709
690- if ( identifierMapping . getNature () != EntityIdentifierMapping . Nature . VIRTUAL ) {
710+ if ( cid == null ) {
691711 throw new IllegalArgumentException ( "expecting IdClass mapping" );
692712 }
693713
694- final CompositeIdentifierMapping cid = (CompositeIdentifierMapping ) identifierMapping ;
695714 final EmbeddableMappingType embeddable = cid .getPartMappingType ();
696715 final String attributeName = property .getName ();
697716 final AttributeMapping attributeMapping = embeddable .findAttributeMapping ( attributeName );
@@ -718,7 +737,7 @@ private static Member resolveVirtualIdentifierMember( Property property, EntityP
718737 return switch ( persistenceType ) {
719738 case ENTITY ->
720739 resolveEntityMember ( property ,
721- getDeclaringEntity ( (AbstractIdentifiableType <?>) ownerType , metadataContext ) );
740+ getAllDeclaringEntities ( (AbstractIdentifiableType <?>) ownerType , metadataContext ) );
722741 case MAPPED_SUPERCLASS ->
723742 resolveMappedSuperclassMember ( property , (MappedSuperclassDomainType <?>) ownerType , metadataContext );
724743 case EMBEDDABLE ->
@@ -727,31 +746,32 @@ private static Member resolveVirtualIdentifierMember( Property property, EntityP
727746 };
728747 };
729748
730- private static Member resolveEntityMember (Property property , EntityPersister declaringEntity ) {
749+ private static Member resolveEntityMember (Property property , java . util . List < EntityPersister > declaringEntities ) {
731750 final String propertyName = property .getName ();
732- final AttributeMapping attributeMapping = declaringEntity .findAttributeMapping ( propertyName );
751+ final EntityPersister firstDeclaringEntity = declaringEntities .getFirst ();
752+ final AttributeMapping attributeMapping = firstDeclaringEntity .findAttributeMapping ( propertyName );
733753 return attributeMapping == null
734754 // just like in #determineIdentifierJavaMember , this *should* indicate we have an IdClass mapping
735- ? resolveVirtualIdentifierMember ( property , declaringEntity )
736- : getter ( declaringEntity , property , propertyName , property .getType ().getReturnedClass () );
755+ ? resolveVirtualIdentifierMember ( property , declaringEntities )
756+ : getter ( firstDeclaringEntity , property , propertyName , property .getType ().getReturnedClass () );
737757 }
738758
739759 private static Member resolveMappedSuperclassMember (
740760 Property property ,
741761 MappedSuperclassDomainType <?> ownerType ,
742762 MetadataContext context ) {
743- final EntityPersister declaringEntity =
744- getDeclaringEntity ( (AbstractIdentifiableType <?>) ownerType , context );
745- if ( declaringEntity != null ) {
746- return resolveEntityMember ( property , declaringEntity );
763+ final java . util . List < EntityPersister > declaringEntities =
764+ getAllDeclaringEntities ( (AbstractIdentifiableType <?>) ownerType , context );
765+ if ( ! declaringEntities . isEmpty () ) {
766+ return resolveEntityMember ( property , declaringEntities );
747767 }
748768 else {
749769 final ManagedDomainType <?> subType = ownerType .getSubTypes ().iterator ().next ();
750770 final Type .PersistenceType persistenceType = subType .getPersistenceType ();
751771 return switch ( persistenceType ) {
752772 case ENTITY ->
753773 resolveEntityMember ( property ,
754- getDeclaringEntity ( (AbstractIdentifiableType <?>) subType , context ) );
774+ getAllDeclaringEntities ( (AbstractIdentifiableType <?>) subType , context ) );
755775 case MAPPED_SUPERCLASS ->
756776 resolveMappedSuperclassMember ( property , (MappedSuperclassDomainType <?>) subType , context );
757777 case EMBEDDABLE ->
0 commit comments