HHH-17612 HHH-18762 Add test for issue

This commit is contained in:
Marco Belladelli 2024-09-30 11:36:57 +02:00 committed by Steve Ebersole
parent 0f092f502e
commit 528129b69a
2 changed files with 252 additions and 0 deletions

View File

@ -0,0 +1,108 @@
/*
* 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.CoreMessageLogger;
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.jboss.logging.Logger;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.TestInstance;
import java.lang.invoke.MethodHandles;
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,
Logger.getMessageLogger(
MethodHandles.lookup(),
CoreMessageLogger.class,
MetadataContext.class.getName()
)
);
}
@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;
}
}

View File

@ -0,0 +1,144 @@
/*
* SPDX-License-Identifier: LGPL-2.1-or-later
* Copyright Red Hat Inc. and Hibernate Authors
*/
package org.hibernate.orm.test.envers.integration.query;
import jakarta.persistence.EntityManager;
import jakarta.persistence.criteria.CriteriaBuilder;
import jakarta.persistence.criteria.CriteriaQuery;
import jakarta.persistence.criteria.Root;
import org.hibernate.envers.enhanced.SequenceIdRevisionEntity;
import org.hibernate.envers.query.AuditEntity;
import org.hibernate.orm.test.envers.BaseEnversJPAFunctionalTestCase;
import org.hibernate.orm.test.envers.Priority;
import org.hibernate.orm.test.envers.entities.StrIntTestEntity;
import org.hibernate.orm.test.envers.entities.ids.EmbId;
import org.hibernate.orm.test.envers.entities.ids.EmbIdTestEntity;
import org.hibernate.orm.test.envers.entities.ids.MulId;
import org.hibernate.orm.test.envers.entities.ids.MulIdTestEntity;
import org.junit.Test;
import org.junit.jupiter.api.Assertions;
import java.util.List;
import static org.assertj.core.api.Assertions.assertThat;
/**
* @author Marco Belladelli
*/
public class RevisionEntityQueryTest extends BaseEnversJPAFunctionalTestCase {
@Override
protected Class<?>[] getAnnotatedClasses() {
return new Class[] {StrIntTestEntity.class, MulIdTestEntity.class, EmbIdTestEntity.class};
}
@Test
@Priority(10)
public void initData() {
// Revision 1
final EntityManager em = getEntityManager();
em.getTransaction().begin();
StrIntTestEntity site1 = new StrIntTestEntity( "a", 10 );
StrIntTestEntity site2 = new StrIntTestEntity( "a", 10 );
StrIntTestEntity site3 = new StrIntTestEntity( "b", 5 );
em.persist( site1 );
em.persist( site2 );
em.persist( site3 );
final Integer id1 = site1.getId();
final Integer id2 = site2.getId();
final Integer id3 = site3.getId();
em.getTransaction().commit();
// Revision 2
em.getTransaction().begin();
final MulId mulId1 = new MulId( 1, 2 );
em.persist( new MulIdTestEntity( mulId1.getId1(), mulId1.getId2(), "data" ) );
final EmbId embId1 = new EmbId( 3, 4 );
em.persist( new EmbIdTestEntity( embId1, "something" ) );
site1 = em.find( StrIntTestEntity.class, id1 );
site2 = em.find( StrIntTestEntity.class, id2 );
site1.setStr1( "aBc" );
site2.setNumber( 20 );
em.getTransaction().commit();
// Revision 3
em.getTransaction().begin();
site3 = em.find( StrIntTestEntity.class, id3 );
site3.setStr1( "a" );
em.getTransaction().commit();
// Revision 4
em.getTransaction().begin();
site1 = em.find( StrIntTestEntity.class, id1 );
em.remove( site1 );
em.getTransaction().commit();
}
@Test
public void testRevisionEntityHqlQuery() {
final EntityManager em = getEntityManager();
em.getTransaction().begin();
final List<SequenceIdRevisionEntity> resultList = em.createQuery(
"select e from SequenceIdRevisionEntity e",
SequenceIdRevisionEntity.class
).getResultList();
assertThat( resultList ).hasSize( 4 );
assertThat( em.createQuery(
String.format( "select e from %s e", SequenceIdRevisionEntity.class.getName() ),
SequenceIdRevisionEntity.class
).getResultList() ).containsAll( resultList );
em.getTransaction().commit();
}
@Test
public void testRevisionEntityCriteriaQuery() {
final EntityManager em = getEntityManager();
em.getTransaction().begin();
final CriteriaBuilder criteriaBuilder = em.getCriteriaBuilder();
final CriteriaQuery<Integer> query = criteriaBuilder.createQuery( Integer.class );
final Root<?> from = query.from( SequenceIdRevisionEntity.class );
final List<Integer> resultList = em.createQuery( query.select( from.get( "id" ) ) ).getResultList();
assertThat( resultList ).hasSize( 4 ).allSatisfy( Assertions::assertNotNull );
em.getTransaction().commit();
}
@Test
public void testQueryForRevisionsOfEntity() {
final EntityManager em = getEntityManager();
em.getTransaction().begin();
//noinspection unchecked
final List<Object> resultList = getAuditReader().createQuery()
.forRevisionsOfEntity( StrIntTestEntity.class, true )
.add( AuditEntity.id().eq( 1 ) )
.add( AuditEntity.revisionNumber().between( 1, 3 ) )
.getResultList();
assertThat( resultList ).hasSize( 2 ).allMatch( r -> r instanceof SequenceIdRevisionEntity );
em.getTransaction().commit();
}
}