From f4cd6e6a85a987593dbabebc97a284a6e784faac Mon Sep 17 00:00:00 2001 From: Marco Belladelli Date: Thu, 20 Mar 2025 10:10:11 +0100 Subject: [PATCH 1/3] HHH-19258 Enable static metamodel generation on envers tests sources --- hibernate-envers/hibernate-envers.gradle | 2 ++ .../onetomany/embeddedid/OneToManyCompositeKeyTest.java | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/hibernate-envers/hibernate-envers.gradle b/hibernate-envers/hibernate-envers.gradle index 7f4c46f97746..24988993ffd2 100644 --- a/hibernate-envers/hibernate-envers.gradle +++ b/hibernate-envers/hibernate-envers.gradle @@ -25,6 +25,8 @@ dependencies { compileOnly jakartaLibs.annotation testImplementation project( ':hibernate-testing' ) + + testAnnotationProcessor project( ':hibernate-processor' ) } test { diff --git a/hibernate-envers/src/test/java/org/hibernate/orm/test/envers/integration/onetomany/embeddedid/OneToManyCompositeKeyTest.java b/hibernate-envers/src/test/java/org/hibernate/orm/test/envers/integration/onetomany/embeddedid/OneToManyCompositeKeyTest.java index 3de08e5fb08e..5beda246a4d5 100644 --- a/hibernate-envers/src/test/java/org/hibernate/orm/test/envers/integration/onetomany/embeddedid/OneToManyCompositeKeyTest.java +++ b/hibernate-envers/src/test/java/org/hibernate/orm/test/envers/integration/onetomany/embeddedid/OneToManyCompositeKeyTest.java @@ -291,7 +291,7 @@ public String toString() { @Entity(name = "Design") @Audited - private static class Design { + public static class Design { @Id private Integer id; From e12d960be2672c15318fc37d0080a90d559adf15 Mon Sep 17 00:00:00 2001 From: Marco Belladelli Date: Thu, 20 Mar 2025 10:25:11 +0100 Subject: [PATCH 2/3] HHH-19258 Add test for issue --- .../test/envers/JpaStaticMetamodelTest.java | 31 ------ .../metamodel/CustomRevisionEntity.java | 23 +++++ .../RevisionEntitiesMetamodelTest.java | 94 ++++++++++++++----- 3 files changed, 91 insertions(+), 57 deletions(-) delete mode 100644 hibernate-envers/src/test/java/org/hibernate/orm/test/envers/JpaStaticMetamodelTest.java create mode 100644 hibernate-envers/src/test/java/org/hibernate/orm/test/envers/integration/metamodel/CustomRevisionEntity.java diff --git a/hibernate-envers/src/test/java/org/hibernate/orm/test/envers/JpaStaticMetamodelTest.java b/hibernate-envers/src/test/java/org/hibernate/orm/test/envers/JpaStaticMetamodelTest.java deleted file mode 100644 index 678736221de2..000000000000 --- a/hibernate-envers/src/test/java/org/hibernate/orm/test/envers/JpaStaticMetamodelTest.java +++ /dev/null @@ -1,31 +0,0 @@ -/* - * SPDX-License-Identifier: Apache-2.0 - * Copyright Red Hat Inc. and Hibernate Authors - */ -package org.hibernate.orm.test.envers; - -import org.hibernate.envers.DefaultRevisionEntity_; -import org.hibernate.envers.DefaultTrackingModifiedEntitiesRevisionEntity_; -import org.hibernate.envers.enhanced.SequenceIdRevisionEntity_; -import org.hibernate.envers.enhanced.SequenceIdTrackingModifiedEntitiesRevisionEntity_; - -import org.hibernate.testing.junit4.BaseUnitTestCase; -import org.junit.Test; - -import static org.junit.Assert.assertNotNull; - -/** - * Just a test to make sure that the generated "JPA static metamodel" classes continue to be generated. - * - * @author Steve Ebersole - */ -public class JpaStaticMetamodelTest extends BaseUnitTestCase { - @Test - public void testStaticMetamodelGenerationHappened() { - // Really in a regression scenario, this class wont even compile... - assertNotNull( DefaultRevisionEntity_.class ); - assertNotNull( DefaultTrackingModifiedEntitiesRevisionEntity_.class ); - assertNotNull( SequenceIdRevisionEntity_.class ); - assertNotNull( SequenceIdTrackingModifiedEntitiesRevisionEntity_.class ); - } -} diff --git a/hibernate-envers/src/test/java/org/hibernate/orm/test/envers/integration/metamodel/CustomRevisionEntity.java b/hibernate-envers/src/test/java/org/hibernate/orm/test/envers/integration/metamodel/CustomRevisionEntity.java new file mode 100644 index 000000000000..27e009d1ccbf --- /dev/null +++ b/hibernate-envers/src/test/java/org/hibernate/orm/test/envers/integration/metamodel/CustomRevisionEntity.java @@ -0,0 +1,23 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * Copyright Red Hat Inc. and Hibernate Authors + */ +package org.hibernate.orm.test.envers.integration.metamodel; + +import jakarta.persistence.Entity; +import org.hibernate.envers.RevisionEntity; +import org.hibernate.envers.RevisionMapping; + +@Entity(name = "CustomRevisionEntity") +@RevisionEntity +class CustomRevisionEntity extends RevisionMapping { + private String username; + + public String getUsername() { + return username; + } + + public void setUsername(String username) { + this.username = username; + } +} 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 index c9cc77573365..25468c8a084f 100644 --- 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 @@ -12,7 +12,11 @@ import org.hibernate.boot.registry.StandardServiceRegistryBuilder; import org.hibernate.engine.spi.SessionFactoryImplementor; import org.hibernate.envers.Audited; +import org.hibernate.envers.RevisionMapping_; +import org.hibernate.envers.TrackingModifiedEntitiesRevisionMapping_; import org.hibernate.envers.configuration.EnversSettings; +import org.hibernate.envers.enhanced.SequenceIdRevisionMapping_; +import org.hibernate.envers.enhanced.SequenceIdTrackingModifiedEntitiesRevisionMapping_; import org.hibernate.internal.CoreMessageLogger; import org.hibernate.metamodel.internal.MetadataContext; import org.hibernate.testing.logger.LogInspectionHelper; @@ -20,7 +24,9 @@ import org.hibernate.testing.orm.junit.Jira; import org.hibernate.testing.util.ServiceRegistryUtil; import org.jboss.logging.Logger; +import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.TestInstance; @@ -32,68 +38,104 @@ /** * @author Marco Belladelli */ -@Jira( "https://hibernate.atlassian.net/browse/HHH-17612" ) -@TestInstance( TestInstance.Lifecycle.PER_CLASS ) +@Jira("https://hibernate.atlassian.net/browse/HHH-17612") +@Jira("https://hibernate.atlassian.net/browse/HHH-19258") +@Jira("https://hibernate.atlassian.net/browse/HHH-10068") +@TestInstance(TestInstance.Lifecycle.PER_CLASS) public class RevisionEntitiesMetamodelTest { - private TriggerOnPrefixLogListener trigger; + private CoreMessageLogger logger; + private TriggerOnPrefixLogListener t1; + private TriggerOnPrefixLogListener t2; @BeforeAll public void setUp() { - trigger = new TriggerOnPrefixLogListener( "HHH015007: Illegal argument on static metamodel field injection" ); - LogInspectionHelper.registerListener( - trigger, - Logger.getMessageLogger( - MethodHandles.lookup(), - CoreMessageLogger.class, - MetadataContext.class.getName() - ) + logger = Logger.getMessageLogger( + MethodHandles.lookup(), + CoreMessageLogger.class, + MetadataContext.class.getName() ); + // HHH-17612 - Injecting the class_ type field fails + t1 = new TriggerOnPrefixLogListener( "HHH015007: Illegal argument on static metamodel field injection" ); + LogInspectionHelper.registerListener( t1, logger ); + // HHH-19259 - Injecting the actual attributes fails + t2 = new TriggerOnPrefixLogListener( "HHH015011: Unable to locate static metamodel field" ); + LogInspectionHelper.registerListener( t2, logger ); + } + + @BeforeEach + public void clear() { + t1.reset(); + t2.reset(); + } + + @AfterAll + public void tearDown() { + LogInspectionHelper.clearAllListeners( logger ); } @Test public void testDefaultRevisionEntity() { - try (final SessionFactoryImplementor ignored = buildSessionFactory( false, true )) { - assertThat( trigger.wasTriggered() ).isFalse(); + try (final SessionFactoryImplementor ignored = buildSessionFactory( false, true, Customer.class )) { + assertListeners(); + assertThat( RevisionMapping_.class ).isNotNull(); } } @Test public void testSequenceIdRevisionEntity() { - try (final SessionFactoryImplementor ignored = buildSessionFactory( false, false )) { - assertThat( trigger.wasTriggered() ).isFalse(); + try (final SessionFactoryImplementor ignored = buildSessionFactory( false, false, Customer.class )) { + assertListeners(); + assertThat( SequenceIdRevisionMapping_.class ).isNotNull(); } } @Test public void testDefaultTrackingModifiedEntitiesRevisionEntity() { - try (final SessionFactoryImplementor ignored = buildSessionFactory( true, true )) { - assertThat( trigger.wasTriggered() ).isFalse(); + try (final SessionFactoryImplementor ignored = buildSessionFactory( true, true, Customer.class )) { + assertListeners(); + assertThat( TrackingModifiedEntitiesRevisionMapping_.class ).isNotNull(); } } @Test public void testSequenceIdTrackingModifiedEntitiesRevisionEntity() { - try (final SessionFactoryImplementor ignored = buildSessionFactory( true, false )) { - assertThat( trigger.wasTriggered() ).isFalse(); + try (final SessionFactoryImplementor ignored = buildSessionFactory( true, false, Customer.class )) { + assertListeners(); + assertListeners(); + assertThat( SequenceIdTrackingModifiedEntitiesRevisionMapping_.class ).isNotNull().isNotNull(); + } + } + + @Test + public void testCustomRevisionEntity() { + try (final SessionFactoryImplementor ignored = buildSessionFactory( false, true, Customer.class, + CustomRevisionEntity.class )) { + assertListeners(); + assertThat( CustomRevisionEntity_.class ).isNotNull(); } } - @SuppressWarnings( "resource" ) - private static SessionFactoryImplementor buildSessionFactory(boolean trackEntities, boolean nativeId) { + @SuppressWarnings("resource") + private static SessionFactoryImplementor buildSessionFactory(boolean trackEntities, boolean nativeId, Class... classes) { 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 ) + .addAnnotatedClasses( classes ) .buildMetadata() .buildSessionFactory() .unwrap( SessionFactoryImplementor.class ); } + private void assertListeners() { + assertThat( t1.wasTriggered() ).as( "HHH015007 was triggered" ).isFalse(); + assertThat( t2.wasTriggered() ).as( "HHH015011 was triggered" ).isFalse(); + } + @Audited - @Entity( name = "Customer" ) - @SuppressWarnings( "unused" ) - public static class Customer { + @Entity(name = "Customer") + @SuppressWarnings("unused") + static class Customer { @Id private Long id; @@ -101,7 +143,7 @@ public static class Customer { private String lastName; - @Column( name = "created_on" ) + @Column(name = "created_on") @CreationTimestamp private Instant createdOn; } From d88852fd009e2571b71635a2157a698240741e6f Mon Sep 17 00:00:00 2001 From: Marco Belladelli Date: Thu, 20 Mar 2025 10:25:30 +0100 Subject: [PATCH 3/3] HHH-19258 Remove `@Entity` annotation from default revision entities --- .../main/java/org/hibernate/envers/DefaultRevisionEntity.java | 3 --- .../envers/DefaultTrackingModifiedEntitiesRevisionEntity.java | 3 --- .../hibernate/envers/enhanced/SequenceIdRevisionEntity.java | 3 --- .../SequenceIdTrackingModifiedEntitiesRevisionEntity.java | 3 --- 4 files changed, 12 deletions(-) diff --git a/hibernate-envers/src/main/java/org/hibernate/envers/DefaultRevisionEntity.java b/hibernate-envers/src/main/java/org/hibernate/envers/DefaultRevisionEntity.java index 43b4b12bc699..2f092c429ade 100644 --- a/hibernate-envers/src/main/java/org/hibernate/envers/DefaultRevisionEntity.java +++ b/hibernate-envers/src/main/java/org/hibernate/envers/DefaultRevisionEntity.java @@ -4,12 +4,9 @@ */ package org.hibernate.envers; -import jakarta.persistence.Entity; - /** * @author Adam Warski (adam at warski dot org) * @author Chris Cranford */ -@Entity public final class DefaultRevisionEntity extends RevisionMapping { } diff --git a/hibernate-envers/src/main/java/org/hibernate/envers/DefaultTrackingModifiedEntitiesRevisionEntity.java b/hibernate-envers/src/main/java/org/hibernate/envers/DefaultTrackingModifiedEntitiesRevisionEntity.java index 359a28f674cd..f21eb717cacc 100644 --- a/hibernate-envers/src/main/java/org/hibernate/envers/DefaultTrackingModifiedEntitiesRevisionEntity.java +++ b/hibernate-envers/src/main/java/org/hibernate/envers/DefaultTrackingModifiedEntitiesRevisionEntity.java @@ -4,8 +4,6 @@ */ package org.hibernate.envers; -import jakarta.persistence.Entity; - /** * Extension of standard {@link DefaultRevisionEntity} that allows tracking entity names changed in each revision. * This revision entity is implicitly used when {@code org.hibernate.envers.track_entities_changed_in_revision} @@ -13,6 +11,5 @@ * * @author Lukasz Antoniak (lukasz dot antoniak at gmail dot com) */ -@Entity public final class DefaultTrackingModifiedEntitiesRevisionEntity extends TrackingModifiedEntitiesRevisionMapping { } diff --git a/hibernate-envers/src/main/java/org/hibernate/envers/enhanced/SequenceIdRevisionEntity.java b/hibernate-envers/src/main/java/org/hibernate/envers/enhanced/SequenceIdRevisionEntity.java index 74b73150686e..439298229d5b 100644 --- a/hibernate-envers/src/main/java/org/hibernate/envers/enhanced/SequenceIdRevisionEntity.java +++ b/hibernate-envers/src/main/java/org/hibernate/envers/enhanced/SequenceIdRevisionEntity.java @@ -4,13 +4,10 @@ */ package org.hibernate.envers.enhanced; -import jakarta.persistence.Entity; - /** * @author Adam Warski (adam at warski dot org) * @author Lukasz Antoniak (lukasz dot antoniak at gmail dot com) * @author Chris Cranford */ -@Entity public final class SequenceIdRevisionEntity extends SequenceIdRevisionMapping { } diff --git a/hibernate-envers/src/main/java/org/hibernate/envers/enhanced/SequenceIdTrackingModifiedEntitiesRevisionEntity.java b/hibernate-envers/src/main/java/org/hibernate/envers/enhanced/SequenceIdTrackingModifiedEntitiesRevisionEntity.java index 8b7922acc24c..05f017f7a372 100644 --- a/hibernate-envers/src/main/java/org/hibernate/envers/enhanced/SequenceIdTrackingModifiedEntitiesRevisionEntity.java +++ b/hibernate-envers/src/main/java/org/hibernate/envers/enhanced/SequenceIdTrackingModifiedEntitiesRevisionEntity.java @@ -4,8 +4,6 @@ */ package org.hibernate.envers.enhanced; -import jakarta.persistence.Entity; - /** * Extension of standard {@link SequenceIdRevisionEntity} that allows tracking entity names changed in each revision. * This revision entity is implicitly used when {@code org.hibernate.envers.track_entities_changed_in_revision} @@ -13,6 +11,5 @@ * * @author Lukasz Antoniak (lukasz dot antoniak at gmail dot com) */ -@Entity public final class SequenceIdTrackingModifiedEntitiesRevisionEntity extends SequenceIdTrackingModifiedEntitiesRevisionMapping { }