|
58 | 58 | import org.hibernate.property.access.internal.PropertyAccessMapImpl; |
59 | 59 | import org.hibernate.property.access.spi.Getter; |
60 | 60 | import org.hibernate.query.sqm.tree.domain.SqmDomainType; |
| 61 | +import org.hibernate.query.sqm.tree.domain.SqmMappedSuperclassDomainType; |
61 | 62 | import org.hibernate.type.AnyType; |
62 | 63 | import org.hibernate.type.BasicType; |
63 | 64 | import org.hibernate.type.CollectionType; |
@@ -740,56 +741,70 @@ private static Member resolveMappedSuperclassMember( |
740 | 741 | Property property, |
741 | 742 | MappedSuperclassDomainType<?> ownerType, |
742 | 743 | MetadataContext context) { |
743 | | - final EntityPersister declaringEntity = |
744 | | - getDeclaringEntity( (AbstractIdentifiableType<?>) ownerType, context ); |
745 | | - if ( declaringEntity != null ) { |
746 | | - return resolveEntityMember( property, declaringEntity ); |
747 | | - } |
748 | | - else { |
749 | | - final ManagedDomainType<?> subType = ownerType.getSubTypes().iterator().next(); |
750 | | - final Type.PersistenceType persistenceType = subType.getPersistenceType(); |
751 | | - return switch ( persistenceType ) { |
752 | | - case ENTITY -> |
753 | | - resolveEntityMember( property, |
754 | | - getDeclaringEntity( (AbstractIdentifiableType<?>) subType, context ) ); |
755 | | - case MAPPED_SUPERCLASS -> |
756 | | - resolveMappedSuperclassMember( property, (MappedSuperclassDomainType<?>) subType, context ); |
757 | | - case EMBEDDABLE -> |
758 | | - resolveEmbeddedMember( property, (EmbeddableDomainType<?>) subType, context ); |
759 | | - default -> throw new IllegalArgumentException( "Unexpected PersistenceType: " + persistenceType ); |
760 | | - }; |
761 | | - } |
| 744 | + return property.getGetter( ownerType.getJavaType() ).getMember(); |
| 745 | +// final EntityPersister declaringEntity = |
| 746 | +// getDeclaringEntity( (AbstractIdentifiableType<?>) ownerType, context ); |
| 747 | +// if ( declaringEntity != null ) { |
| 748 | +// return resolveEntityMember( property, declaringEntity ); |
| 749 | +// } |
| 750 | +// else { |
| 751 | +// final ManagedDomainType<?> subType = ownerType.getSubTypes().iterator().next(); |
| 752 | +// final Type.PersistenceType persistenceType = subType.getPersistenceType(); |
| 753 | +// return switch ( persistenceType ) { |
| 754 | +// case ENTITY -> |
| 755 | +// resolveEntityMember( property, |
| 756 | +// getDeclaringEntity( (AbstractIdentifiableType<?>) subType, context ) ); |
| 757 | +// case MAPPED_SUPERCLASS -> |
| 758 | +// resolveMappedSuperclassMember( property, (MappedSuperclassDomainType<?>) subType, context ); |
| 759 | +// case EMBEDDABLE -> |
| 760 | +// resolveEmbeddedMember( property, (EmbeddableDomainType<?>) subType, context ); |
| 761 | +// default -> throw new IllegalArgumentException( "Unexpected PersistenceType: " + persistenceType ); |
| 762 | +// }; |
| 763 | +// } |
762 | 764 | } |
763 | 765 |
|
764 | 766 | private final MemberResolver identifierMemberResolver = (attributeContext, metadataContext) -> { |
765 | 767 | final AbstractIdentifiableType<?> identifiableType = |
766 | 768 | (AbstractIdentifiableType<?>) attributeContext.getOwnerType(); |
767 | | - final EntityPersister declaringEntityMapping = getDeclaringEntity( identifiableType, metadataContext ); |
768 | | - final EntityIdentifierMapping identifierMapping = declaringEntityMapping.getIdentifierMapping(); |
769 | | - final Property propertyMapping = attributeContext.getPropertyMapping(); |
770 | | - return !propertyMapping.getName().equals( identifierMapping.getAttributeName() ) |
771 | | - // this *should* indicate processing part of an IdClass... |
772 | | - ? virtualIdentifierMemberResolver.resolveMember( attributeContext, metadataContext ) |
773 | | - : getter( declaringEntityMapping, propertyMapping, |
774 | | - identifierMapping.getAttributeName(), identifierMapping.getJavaType().getJavaTypeClass() ); |
775 | | - |
| 769 | + if ( identifiableType instanceof SqmMappedSuperclassDomainType<?> ) { |
| 770 | + return attributeContext.getPropertyMapping() |
| 771 | + .getGetter( identifiableType.getJavaType() ) |
| 772 | + .getMember(); |
| 773 | + } |
| 774 | + else { |
| 775 | + final EntityPersister declaringEntityMapping = getDeclaringEntity( identifiableType, metadataContext ); |
| 776 | + final EntityIdentifierMapping identifierMapping = declaringEntityMapping.getIdentifierMapping(); |
| 777 | + final Property propertyMapping = attributeContext.getPropertyMapping(); |
| 778 | + return !propertyMapping.getName().equals( identifierMapping.getAttributeName() ) |
| 779 | + // this *should* indicate processing part of an IdClass... |
| 780 | + ? virtualIdentifierMemberResolver.resolveMember( attributeContext, metadataContext ) |
| 781 | + : getter( declaringEntityMapping, propertyMapping, |
| 782 | + identifierMapping.getAttributeName(), identifierMapping.getJavaType().getJavaTypeClass() ); |
| 783 | + } |
776 | 784 | }; |
777 | 785 |
|
778 | 786 | private final MemberResolver versionMemberResolver = (attributeContext, metadataContext) -> { |
779 | 787 | final AbstractIdentifiableType<?> identifiableType = |
780 | 788 | (AbstractIdentifiableType<?>) attributeContext.getOwnerType(); |
781 | | - final EntityPersister entityPersister = getDeclaringEntity( identifiableType, metadataContext ); |
782 | | - final EntityVersionMapping versionMapping = entityPersister.getVersionMapping(); |
783 | | - assert entityPersister.isVersioned(); |
784 | | - assert versionMapping != null; |
785 | | - |
786 | | - final String versionPropertyName = attributeContext.getPropertyMapping().getName(); |
787 | | - if ( !versionPropertyName.equals( versionMapping.getVersionAttribute().getAttributeName() ) ) { |
788 | | - // this should never happen, but to be safe... |
789 | | - throw new IllegalArgumentException( "Given property did not match declared version property" ); |
790 | | - } |
791 | | - return getter( entityPersister, attributeContext.getPropertyMapping(), |
792 | | - versionPropertyName, versionMapping.getJavaType().getJavaTypeClass() ); |
| 789 | + if ( identifiableType instanceof SqmMappedSuperclassDomainType<?> ) { |
| 790 | + return attributeContext.getPropertyMapping() |
| 791 | + .getGetter( identifiableType.getJavaType() ) |
| 792 | + .getMember(); |
| 793 | + } |
| 794 | + else { |
| 795 | + final EntityPersister entityPersister = getDeclaringEntity( identifiableType, metadataContext ); |
| 796 | + final EntityVersionMapping versionMapping = entityPersister.getVersionMapping(); |
| 797 | + assert entityPersister.isVersioned(); |
| 798 | + assert versionMapping != null; |
| 799 | + |
| 800 | + final String versionPropertyName = attributeContext.getPropertyMapping().getName(); |
| 801 | + if ( !versionPropertyName.equals( versionMapping.getVersionAttribute().getAttributeName() ) ) { |
| 802 | + // this should never happen, but to be safe... |
| 803 | + throw new IllegalArgumentException( "Given property did not match declared version property" ); |
| 804 | + } |
| 805 | + return getter( entityPersister, attributeContext.getPropertyMapping(), |
| 806 | + versionPropertyName, versionMapping.getJavaType().getJavaTypeClass() ); |
| 807 | + } |
793 | 808 | }; |
794 | 809 |
|
795 | 810 | private static Member getter(EntityPersister persister, Property property, String name, Class<?> type) { |
|
0 commit comments