9
9
import java .lang .reflect .Method ;
10
10
import java .lang .reflect .ParameterizedType ;
11
11
import java .util .HashMap ;
12
+ import java .util .Set ;
12
13
13
14
import org .hibernate .AssertionFailure ;
14
15
import org .hibernate .PropertyNotFoundException ;
@@ -395,20 +396,29 @@ private static JavaType<?> determineRelationalJavaType(
395
396
private static EntityPersister getDeclaringEntity (
396
397
AbstractIdentifiableType <?> ownerType ,
397
398
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 ) {
398
405
return getDeclarerEntityPersister ( ownerType , metadataContext );
399
406
}
400
407
401
- private static EntityPersister getDeclarerEntityPersister (
408
+ private static java . util . List < EntityPersister > getDeclarerEntityPersister (
402
409
AbstractIdentifiableType <?> ownerType ,
403
410
MetadataContext metadataContext ) {
404
411
final Type .PersistenceType persistenceType = ownerType .getPersistenceType ();
405
412
if ( persistenceType == Type .PersistenceType .ENTITY ) {
406
- return metadataContext .getMetamodel ().getEntityDescriptor ( ownerType .getTypeName () );
413
+ return java . util . List . of ( metadataContext .getMetamodel ().getEntityDescriptor ( ownerType .getTypeName () ) );
407
414
}
408
415
else if ( persistenceType == Type .PersistenceType .MAPPED_SUPERCLASS ) {
409
- final PersistentClass persistentClass =
416
+ final Set < PersistentClass > persistentClassSet =
410
417
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 ();
412
422
}
413
423
else {
414
424
throw new AssertionFailure ( "Cannot get the metamodel for PersistenceType: " + persistenceType );
@@ -680,18 +690,27 @@ private static EmbeddableRepresentationStrategy ownerRepresentationStrategy(
680
690
681
691
private static final MemberResolver virtualIdentifierMemberResolver = (attributeContext , metadataContext ) -> {
682
692
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 );
685
695
};
686
696
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
+ }
689
709
690
- if ( identifierMapping . getNature () != EntityIdentifierMapping . Nature . VIRTUAL ) {
710
+ if ( cid == null ) {
691
711
throw new IllegalArgumentException ( "expecting IdClass mapping" );
692
712
}
693
713
694
- final CompositeIdentifierMapping cid = (CompositeIdentifierMapping ) identifierMapping ;
695
714
final EmbeddableMappingType embeddable = cid .getPartMappingType ();
696
715
final String attributeName = property .getName ();
697
716
final AttributeMapping attributeMapping = embeddable .findAttributeMapping ( attributeName );
@@ -718,7 +737,7 @@ private static Member resolveVirtualIdentifierMember( Property property, EntityP
718
737
return switch ( persistenceType ) {
719
738
case ENTITY ->
720
739
resolveEntityMember ( property ,
721
- getDeclaringEntity ( (AbstractIdentifiableType <?>) ownerType , metadataContext ) );
740
+ getAllDeclaringEntities ( (AbstractIdentifiableType <?>) ownerType , metadataContext ) );
722
741
case MAPPED_SUPERCLASS ->
723
742
resolveMappedSuperclassMember ( property , (MappedSuperclassDomainType <?>) ownerType , metadataContext );
724
743
case EMBEDDABLE ->
@@ -727,31 +746,32 @@ private static Member resolveVirtualIdentifierMember( Property property, EntityP
727
746
};
728
747
};
729
748
730
- private static Member resolveEntityMember (Property property , EntityPersister declaringEntity ) {
749
+ private static Member resolveEntityMember (Property property , java . util . List < EntityPersister > declaringEntities ) {
731
750
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 );
733
753
return attributeMapping == null
734
754
// 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 () );
737
757
}
738
758
739
759
private static Member resolveMappedSuperclassMember (
740
760
Property property ,
741
761
MappedSuperclassDomainType <?> ownerType ,
742
762
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 );
747
767
}
748
768
else {
749
769
final ManagedDomainType <?> subType = ownerType .getSubTypes ().iterator ().next ();
750
770
final Type .PersistenceType persistenceType = subType .getPersistenceType ();
751
771
return switch ( persistenceType ) {
752
772
case ENTITY ->
753
773
resolveEntityMember ( property ,
754
- getDeclaringEntity ( (AbstractIdentifiableType <?>) subType , context ) );
774
+ getAllDeclaringEntities ( (AbstractIdentifiableType <?>) subType , context ) );
755
775
case MAPPED_SUPERCLASS ->
756
776
resolveMappedSuperclassMember ( property , (MappedSuperclassDomainType <?>) subType , context );
757
777
case EMBEDDABLE ->
0 commit comments