diff --git a/hibernate-core/src/main/java/org/hibernate/metamodel/internal/MetadataContext.java b/hibernate-core/src/main/java/org/hibernate/metamodel/internal/MetadataContext.java
index 863cd8f9213b..54793b8cc030 100644
--- a/hibernate-core/src/main/java/org/hibernate/metamodel/internal/MetadataContext.java
+++ b/hibernate-core/src/main/java/org/hibernate/metamodel/internal/MetadataContext.java
@@ -26,7 +26,6 @@
import org.hibernate.internal.HEMLogging;
import org.hibernate.internal.util.ReflectHelper;
import org.hibernate.internal.util.collections.CollectionHelper;
-import org.hibernate.internal.util.collections.JoinedList;
import org.hibernate.mapping.Component;
import org.hibernate.mapping.MappedSuperclass;
import org.hibernate.mapping.PersistentClass;
@@ -61,8 +60,6 @@
import jakarta.persistence.metamodel.SingularAttribute;
import jakarta.persistence.metamodel.Type;
-import static org.hibernate.internal.util.StringHelper.root;
-
/**
* Defines a context for storing information during the building of the {@link MappingMetamodelImpl}.
*
@@ -810,15 +807,28 @@ private static void injectField(
// + "; expected type : " + attribute.getClass().getName()
// + "; encountered type : " + field.getType().getName()
// );
- LOG.illegalArgumentOnStaticMetamodelFieldInjection(
- metamodelClass.getName(),
- name,
- model.getClass().getName(),
- field.getType().getName()
- );
+ // Avoid logging an error for Enver's default revision classes that are both entities and mapped-supers.
+ // This is a workaround for https://hibernate.atlassian.net/browse/HHH-17612
+ if ( !isDefaultEnversRevisionType( metamodelClass ) ) {
+ LOG.illegalArgumentOnStaticMetamodelFieldInjection(
+ metamodelClass.getName(),
+ name,
+ model.getClass().getName(),
+ field.getType().getName()
+ );
+ }
}
}
+ private static boolean isDefaultEnversRevisionType(Class> metamodelClass) {
+ return Set.of(
+ "org.hibernate.envers.DefaultRevisionEntity_",
+ "org.hibernate.envers.DefaultTrackingModifiedEntitiesRevisionEntity_",
+ "org.hibernate.envers.enhanced.SequenceIdRevisionEntity_",
+ "org.hibernate.envers.enhanced.SequenceIdTrackingModifiedEntitiesRevisionEntity_"
+ ).contains( metamodelClass.getName() );
+ }
+
public MappedSuperclassDomainType> locateMappedSuperclassType(MappedSuperclass mappedSuperclass) {
return mappedSuperclassByMappedSuperclassMapping.get( mappedSuperclass );
}
diff --git a/hibernate-envers/src/test/java/org/hibernate/orm/test/envers/integration/metamodel/RevisionEntitiesMetamodelTest.java b/hibernate-envers/src/test/java/org/hibernate/orm/test/envers/integration/metamodel/RevisionEntitiesMetamodelTest.java
new file mode 100644
index 000000000000..78504c8bd1c7
--- /dev/null
+++ b/hibernate-envers/src/test/java/org/hibernate/orm/test/envers/integration/metamodel/RevisionEntitiesMetamodelTest.java
@@ -0,0 +1,99 @@
+/*
+ * SPDX-License-Identifier: LGPL-2.1-or-later
+ * Copyright Red Hat Inc. and Hibernate Authors
+ */
+package org.hibernate.orm.test.envers.integration.metamodel;
+
+import jakarta.persistence.Column;
+import jakarta.persistence.Entity;
+import jakarta.persistence.Id;
+import org.hibernate.annotations.CreationTimestamp;
+import org.hibernate.boot.MetadataSources;
+import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
+import org.hibernate.engine.spi.SessionFactoryImplementor;
+import org.hibernate.envers.Audited;
+import org.hibernate.envers.configuration.EnversSettings;
+import org.hibernate.internal.HEMLogging;
+import org.hibernate.metamodel.internal.MetadataContext;
+import org.hibernate.testing.logger.LogInspectionHelper;
+import org.hibernate.testing.logger.TriggerOnPrefixLogListener;
+import org.hibernate.testing.orm.junit.Jira;
+import org.hibernate.testing.util.ServiceRegistryUtil;
+import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.TestInstance;
+
+import java.time.Instant;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+/**
+ * @author Marco Belladelli
+ */
+@Jira( "https://hibernate.atlassian.net/browse/HHH-17612" )
+@TestInstance( TestInstance.Lifecycle.PER_CLASS )
+public class RevisionEntitiesMetamodelTest {
+ private TriggerOnPrefixLogListener trigger;
+
+ @BeforeAll
+ public void setUp() {
+ trigger = new TriggerOnPrefixLogListener( "HHH015007: Illegal argument on static metamodel field injection" );
+ LogInspectionHelper.registerListener( trigger, HEMLogging.messageLogger( MetadataContext.class ) );
+ }
+
+ @Test
+ public void testDefaultRevisionEntity() {
+ try (final SessionFactoryImplementor ignored = buildSessionFactory( false, true )) {
+ assertThat( trigger.wasTriggered() ).isFalse();
+ }
+ }
+
+ @Test
+ public void testSequenceIdRevisionEntity() {
+ try (final SessionFactoryImplementor ignored = buildSessionFactory( false, false )) {
+ assertThat( trigger.wasTriggered() ).isFalse();
+ }
+ }
+
+ @Test
+ public void testDefaultTrackingModifiedEntitiesRevisionEntity() {
+ try (final SessionFactoryImplementor ignored = buildSessionFactory( true, true )) {
+ assertThat( trigger.wasTriggered() ).isFalse();
+ }
+ }
+
+ @Test
+ public void testSequenceIdTrackingModifiedEntitiesRevisionEntity() {
+ try (final SessionFactoryImplementor ignored = buildSessionFactory( true, false )) {
+ assertThat( trigger.wasTriggered() ).isFalse();
+ }
+ }
+
+ @SuppressWarnings( "resource" )
+ private static SessionFactoryImplementor buildSessionFactory(boolean trackEntities, boolean nativeId) {
+ final StandardServiceRegistryBuilder registryBuilder = ServiceRegistryUtil.serviceRegistryBuilder();
+ registryBuilder.applySetting( EnversSettings.TRACK_ENTITIES_CHANGED_IN_REVISION, trackEntities );
+ registryBuilder.applySetting( EnversSettings.USE_REVISION_ENTITY_WITH_NATIVE_ID, nativeId );
+ return new MetadataSources( registryBuilder.build() )
+ .addAnnotatedClasses( Customer.class )
+ .buildMetadata()
+ .buildSessionFactory()
+ .unwrap( SessionFactoryImplementor.class );
+ }
+
+ @Audited
+ @Entity( name = "Customer" )
+ @SuppressWarnings( "unused" )
+ public static class Customer {
+ @Id
+ private Long id;
+
+ private String firstName;
+
+ private String lastName;
+
+ @Column( name = "created_on" )
+ @CreationTimestamp
+ private Instant createdOn;
+ }
+}