|
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