HHH-17612 HHH-18762 Add test for issue
This commit is contained in:
parent
0f092f502e
commit
528129b69a
|
@ -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;
|
||||||
|
}
|
||||||
|
}
|
|
@ -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();
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue