diff --git a/hibernate-core/src/main/java/org/hibernate/metamodel/internal/AttributeFactory.java b/hibernate-core/src/main/java/org/hibernate/metamodel/internal/AttributeFactory.java index b02929cdc1c4..a413ad0dcb06 100644 --- a/hibernate-core/src/main/java/org/hibernate/metamodel/internal/AttributeFactory.java +++ b/hibernate-core/src/main/java/org/hibernate/metamodel/internal/AttributeFactory.java @@ -689,8 +689,8 @@ private static Member resolveVirtualIdentifierMember( Property property, EntityP private static Member resolveEntityMember(Property property, EntityPersister declaringEntity) { final String propertyName = property.getName(); - final var attributeMapping = declaringEntity.findAttributeMapping( propertyName ); - return attributeMapping == null + return !propertyName.equals( declaringEntity.getIdentifierPropertyName() ) + && declaringEntity.findAttributeMapping( propertyName ) == null // just like in #determineIdentifierJavaMember , this *should* indicate we have an IdClass mapping ? resolveVirtualIdentifierMember( property, declaringEntity ) : getter( declaringEntity, property, propertyName, property.getType().getReturnedClass() ); diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/mapping/generics/compositeid/CompositeIdWithGenericPartInMappedSuperclassTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/mapping/generics/compositeid/CompositeIdWithGenericPartInMappedSuperclassTest.java new file mode 100644 index 000000000000..5717572c8486 --- /dev/null +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/mapping/generics/compositeid/CompositeIdWithGenericPartInMappedSuperclassTest.java @@ -0,0 +1,94 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * Copyright Red Hat Inc. and Hibernate Authors + */ +package org.hibernate.orm.test.mapping.generics.compositeid; + +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.Id; +import jakarta.persistence.IdClass; +import jakarta.persistence.MappedSuperclass; +import org.hibernate.testing.orm.junit.DomainModel; +import org.hibernate.testing.orm.junit.JiraKey; +import org.hibernate.testing.orm.junit.SessionFactory; +import org.hibernate.testing.orm.junit.SessionFactoryScope; +import org.junit.jupiter.api.Test; + +import java.io.Serializable; +import java.util.Objects; + +@JiraKey("HHH-19706") +@DomainModel( + annotatedClasses = { + CompositeIdWithGenericPartInMappedSuperclassTest.SampleCompositeIdEntity.class, + CompositeIdWithGenericPartInMappedSuperclassTest.SampleEntity.class, + CompositeIdWithGenericPartInMappedSuperclassTest.SampleSuperclass.class + } +) +@SessionFactory +class CompositeIdWithGenericPartInMappedSuperclassTest { + + @Test + void test(SessionFactoryScope scope) { + scope.inSession( s -> s.createQuery( "from SampleEntity", SampleEntity.class ).getResultList() ); + } + + @Entity + @IdClass(SampleCompositeIdEntity.AdditionalIdEntityId.class) + static class SampleCompositeIdEntity extends SampleSuperclass { + + @Id + @Column(nullable = false, updatable = false) + private Long additionalId; + + static class AdditionalIdEntityId implements Serializable { + + final Long mainId; + final Long additionalId; + + public AdditionalIdEntityId() { + this( 0L, 0L ); + } + + public AdditionalIdEntityId(Long mainId, Long additionalId) { + this.mainId = mainId; + this.additionalId = additionalId; + } + + @Override + public boolean equals(Object o) { + if ( this == o ) { + return true; + } + if ( !(o instanceof AdditionalIdEntityId) ) { + return false; + } + AdditionalIdEntityId key = (AdditionalIdEntityId) o; + return Objects.equals( mainId, key.mainId ) && Objects.equals( additionalId, key.additionalId ); + } + + @Override + public int hashCode() { + return Objects.hash( mainId, additionalId ); + } + + } + + } + + @Entity(name = "SampleEntity") + static class SampleEntity extends SampleSuperclass { + + private String sampleField; + + } + + @MappedSuperclass + abstract static class SampleSuperclass> { + + @Id + private K mainId; + + } +}