Skip to content

Commit 804c604

Browse files
committed
HHH-19076 Resolve member of MappedSuperclass specially
1 parent 3b9b2e4 commit 804c604

File tree

1 file changed

+55
-40
lines changed

1 file changed

+55
-40
lines changed

hibernate-core/src/main/java/org/hibernate/metamodel/internal/AttributeFactory.java

Lines changed: 55 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@
5858
import org.hibernate.property.access.internal.PropertyAccessMapImpl;
5959
import org.hibernate.property.access.spi.Getter;
6060
import org.hibernate.query.sqm.tree.domain.SqmDomainType;
61+
import org.hibernate.query.sqm.tree.domain.SqmMappedSuperclassDomainType;
6162
import org.hibernate.type.AnyType;
6263
import org.hibernate.type.BasicType;
6364
import org.hibernate.type.CollectionType;
@@ -740,56 +741,70 @@ private static Member resolveMappedSuperclassMember(
740741
Property property,
741742
MappedSuperclassDomainType<?> ownerType,
742743
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+
// }
762764
}
763765

764766
private final MemberResolver identifierMemberResolver = (attributeContext, metadataContext) -> {
765767
final AbstractIdentifiableType<?> identifiableType =
766768
(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+
}
776784
};
777785

778786
private final MemberResolver versionMemberResolver = (attributeContext, metadataContext) -> {
779787
final AbstractIdentifiableType<?> identifiableType =
780788
(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+
}
793808
};
794809

795810
private static Member getter(EntityPersister persister, Property property, String name, Class<?> type) {

0 commit comments

Comments
 (0)