From 263ef56970e330809a7843504d09ec18af1820d1 Mon Sep 17 00:00:00 2001 From: Christian Beikov Date: Wed, 7 Aug 2024 17:53:10 +0200 Subject: [PATCH] HHH-17465 Incorrect metamodel for shared version attribute in @MappedSuperclass --- .../boot/model/internal/PropertyBinder.java | 5 ++++- .../orm/test/jpa/metadata/MetadataTest.java | 12 ++++++++++++ 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/hibernate-core/src/main/java/org/hibernate/boot/model/internal/PropertyBinder.java b/hibernate-core/src/main/java/org/hibernate/boot/model/internal/PropertyBinder.java index 6cea97ba3511..8295a9ff56c7 100644 --- a/hibernate-core/src/main/java/org/hibernate/boot/model/internal/PropertyBinder.java +++ b/hibernate-core/src/main/java/org/hibernate/boot/model/internal/PropertyBinder.java @@ -979,7 +979,10 @@ private static void bindVersionProperty( final org.hibernate.mapping.MappedSuperclass superclass = getMappedSuperclassOrNull( declaringClass, inheritanceStatePerClass, context ); if ( superclass != null ) { - superclass.setDeclaredVersion( property ); + // Don't overwrite an existing version property + if ( superclass.getDeclaredVersion() == null ) { + superclass.setDeclaredVersion( property ); + } } else { //we know the property is on the actual entity diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/metadata/MetadataTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/metadata/MetadataTest.java index 3c87f29b4cc0..030893804ab0 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/metadata/MetadataTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/metadata/MetadataTest.java @@ -29,6 +29,7 @@ import org.hibernate.testing.TestForIssue; import org.hibernate.testing.orm.junit.EntityManagerFactoryScope; +import org.hibernate.testing.orm.junit.Jira; import org.hibernate.testing.orm.junit.Jpa; import org.hibernate.testing.util.ServiceRegistryUtil; import org.junit.jupiter.api.Test; @@ -413,6 +414,17 @@ public void testBackrefAndGenerics(EntityManagerFactoryScope scope) { assertEquals(collectionElement, child); } + @Test + @Jira("https://hibernate.atlassian.net/browse/HHH-17465") + public void testInheritedVersion(EntityManagerFactoryScope scope) { + EntityManagerFactory emf = scope.getEntityManagerFactory(); + assertNotNull(emf.getMetamodel()); + final EntityType entityType = emf.getMetamodel().entity(Cat.class); + assertTrue(entityType.hasVersionAttribute()); + assertTrue(entityType.getSingularAttribute("version").isVersion()); + + } + private void ensureProperMember(Set attributes) { //we do not update the set so we are safe @SuppressWarnings("unchecked") final Set> safeAttributes = (Set>) attributes;