Skip to content

Commit 009905c

Browse files
committed
HHH-17612 HHH-18762 Add test for issue
1 parent 7002ee8 commit 009905c

File tree

2 files changed

+252
-0
lines changed

2 files changed

+252
-0
lines changed
Lines changed: 108 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,108 @@
1+
/*
2+
* SPDX-License-Identifier: LGPL-2.1-or-later
3+
* Copyright Red Hat Inc. and Hibernate Authors
4+
*/
5+
package org.hibernate.orm.test.envers.integration.metamodel;
6+
7+
import jakarta.persistence.Column;
8+
import jakarta.persistence.Entity;
9+
import jakarta.persistence.Id;
10+
import org.hibernate.annotations.CreationTimestamp;
11+
import org.hibernate.boot.MetadataSources;
12+
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
13+
import org.hibernate.engine.spi.SessionFactoryImplementor;
14+
import org.hibernate.envers.Audited;
15+
import org.hibernate.envers.configuration.EnversSettings;
16+
import org.hibernate.internal.CoreMessageLogger;
17+
import org.hibernate.metamodel.internal.MetadataContext;
18+
import org.hibernate.testing.logger.LogInspectionHelper;
19+
import org.hibernate.testing.logger.TriggerOnPrefixLogListener;
20+
import org.hibernate.testing.orm.junit.Jira;
21+
import org.hibernate.testing.util.ServiceRegistryUtil;
22+
import org.jboss.logging.Logger;
23+
import org.junit.jupiter.api.BeforeAll;
24+
import org.junit.jupiter.api.Test;
25+
import org.junit.jupiter.api.TestInstance;
26+
27+
import java.lang.invoke.MethodHandles;
28+
import java.time.Instant;
29+
30+
import static org.assertj.core.api.Assertions.assertThat;
31+
32+
/**
33+
* @author Marco Belladelli
34+
*/
35+
@Jira( "https://hibernate.atlassian.net/browse/HHH-17612" )
36+
@TestInstance( TestInstance.Lifecycle.PER_CLASS )
37+
public class RevisionEntitiesMetamodelTest {
38+
private TriggerOnPrefixLogListener trigger;
39+
40+
@BeforeAll
41+
public void setUp() {
42+
trigger = new TriggerOnPrefixLogListener( "HHH015007: Illegal argument on static metamodel field injection" );
43+
LogInspectionHelper.registerListener(
44+
trigger,
45+
Logger.getMessageLogger(
46+
MethodHandles.lookup(),
47+
CoreMessageLogger.class,
48+
MetadataContext.class.getName()
49+
)
50+
);
51+
}
52+
53+
@Test
54+
public void testDefaultRevisionEntity() {
55+
try (final SessionFactoryImplementor ignored = buildSessionFactory( false, true )) {
56+
assertThat( trigger.wasTriggered() ).isFalse();
57+
}
58+
}
59+
60+
@Test
61+
public void testSequenceIdRevisionEntity() {
62+
try (final SessionFactoryImplementor ignored = buildSessionFactory( false, false )) {
63+
assertThat( trigger.wasTriggered() ).isFalse();
64+
}
65+
}
66+
67+
@Test
68+
public void testDefaultTrackingModifiedEntitiesRevisionEntity() {
69+
try (final SessionFactoryImplementor ignored = buildSessionFactory( true, true )) {
70+
assertThat( trigger.wasTriggered() ).isFalse();
71+
}
72+
}
73+
74+
@Test
75+
public void testSequenceIdTrackingModifiedEntitiesRevisionEntity() {
76+
try (final SessionFactoryImplementor ignored = buildSessionFactory( true, false )) {
77+
assertThat( trigger.wasTriggered() ).isFalse();
78+
}
79+
}
80+
81+
@SuppressWarnings( "resource" )
82+
private static SessionFactoryImplementor buildSessionFactory(boolean trackEntities, boolean nativeId) {
83+
final StandardServiceRegistryBuilder registryBuilder = ServiceRegistryUtil.serviceRegistryBuilder();
84+
registryBuilder.applySetting( EnversSettings.TRACK_ENTITIES_CHANGED_IN_REVISION, trackEntities );
85+
registryBuilder.applySetting( EnversSettings.USE_REVISION_ENTITY_WITH_NATIVE_ID, nativeId );
86+
return new MetadataSources( registryBuilder.build() )
87+
.addAnnotatedClasses( Customer.class )
88+
.buildMetadata()
89+
.buildSessionFactory()
90+
.unwrap( SessionFactoryImplementor.class );
91+
}
92+
93+
@Audited
94+
@Entity( name = "Customer" )
95+
@SuppressWarnings( "unused" )
96+
public static class Customer {
97+
@Id
98+
private Long id;
99+
100+
private String firstName;
101+
102+
private String lastName;
103+
104+
@Column( name = "created_on" )
105+
@CreationTimestamp
106+
private Instant createdOn;
107+
}
108+
}
Lines changed: 144 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,144 @@
1+
/*
2+
* SPDX-License-Identifier: LGPL-2.1-or-later
3+
* Copyright Red Hat Inc. and Hibernate Authors
4+
*/
5+
package org.hibernate.orm.test.envers.integration.query;
6+
7+
import jakarta.persistence.EntityManager;
8+
import jakarta.persistence.criteria.CriteriaBuilder;
9+
import jakarta.persistence.criteria.CriteriaQuery;
10+
import jakarta.persistence.criteria.Root;
11+
import org.hibernate.envers.enhanced.SequenceIdRevisionEntity;
12+
import org.hibernate.envers.query.AuditEntity;
13+
import org.hibernate.orm.test.envers.BaseEnversJPAFunctionalTestCase;
14+
import org.hibernate.orm.test.envers.Priority;
15+
import org.hibernate.orm.test.envers.entities.StrIntTestEntity;
16+
import org.hibernate.orm.test.envers.entities.ids.EmbId;
17+
import org.hibernate.orm.test.envers.entities.ids.EmbIdTestEntity;
18+
import org.hibernate.orm.test.envers.entities.ids.MulId;
19+
import org.hibernate.orm.test.envers.entities.ids.MulIdTestEntity;
20+
import org.junit.Test;
21+
import org.junit.jupiter.api.Assertions;
22+
23+
import java.util.List;
24+
25+
import static org.assertj.core.api.Assertions.assertThat;
26+
27+
/**
28+
* @author Marco Belladelli
29+
*/
30+
public class RevisionEntityQueryTest extends BaseEnversJPAFunctionalTestCase {
31+
@Override
32+
protected Class<?>[] getAnnotatedClasses() {
33+
return new Class[] {StrIntTestEntity.class, MulIdTestEntity.class, EmbIdTestEntity.class};
34+
}
35+
36+
@Test
37+
@Priority(10)
38+
public void initData() {
39+
// Revision 1
40+
final EntityManager em = getEntityManager();
41+
em.getTransaction().begin();
42+
43+
StrIntTestEntity site1 = new StrIntTestEntity( "a", 10 );
44+
StrIntTestEntity site2 = new StrIntTestEntity( "a", 10 );
45+
StrIntTestEntity site3 = new StrIntTestEntity( "b", 5 );
46+
47+
em.persist( site1 );
48+
em.persist( site2 );
49+
em.persist( site3 );
50+
51+
final Integer id1 = site1.getId();
52+
final Integer id2 = site2.getId();
53+
final Integer id3 = site3.getId();
54+
55+
em.getTransaction().commit();
56+
57+
// Revision 2
58+
em.getTransaction().begin();
59+
60+
final MulId mulId1 = new MulId( 1, 2 );
61+
em.persist( new MulIdTestEntity( mulId1.getId1(), mulId1.getId2(), "data" ) );
62+
63+
final EmbId embId1 = new EmbId( 3, 4 );
64+
em.persist( new EmbIdTestEntity( embId1, "something" ) );
65+
66+
site1 = em.find( StrIntTestEntity.class, id1 );
67+
site2 = em.find( StrIntTestEntity.class, id2 );
68+
69+
site1.setStr1( "aBc" );
70+
site2.setNumber( 20 );
71+
72+
em.getTransaction().commit();
73+
74+
// Revision 3
75+
em.getTransaction().begin();
76+
77+
site3 = em.find( StrIntTestEntity.class, id3 );
78+
79+
site3.setStr1( "a" );
80+
81+
em.getTransaction().commit();
82+
83+
// Revision 4
84+
em.getTransaction().begin();
85+
86+
site1 = em.find( StrIntTestEntity.class, id1 );
87+
88+
em.remove( site1 );
89+
90+
em.getTransaction().commit();
91+
}
92+
93+
@Test
94+
public void testRevisionEntityHqlQuery() {
95+
final EntityManager em = getEntityManager();
96+
em.getTransaction().begin();
97+
98+
final List<SequenceIdRevisionEntity> resultList = em.createQuery(
99+
"select e from SequenceIdRevisionEntity e",
100+
SequenceIdRevisionEntity.class
101+
).getResultList();
102+
103+
assertThat( resultList ).hasSize( 4 );
104+
105+
assertThat( em.createQuery(
106+
String.format( "select e from %s e", SequenceIdRevisionEntity.class.getName() ),
107+
SequenceIdRevisionEntity.class
108+
).getResultList() ).containsAll( resultList );
109+
110+
em.getTransaction().commit();
111+
}
112+
113+
@Test
114+
public void testRevisionEntityCriteriaQuery() {
115+
final EntityManager em = getEntityManager();
116+
em.getTransaction().begin();
117+
118+
final CriteriaBuilder criteriaBuilder = em.getCriteriaBuilder();
119+
final CriteriaQuery<Integer> query = criteriaBuilder.createQuery( Integer.class );
120+
final Root<?> from = query.from( SequenceIdRevisionEntity.class );
121+
final List<Integer> resultList = em.createQuery( query.select( from.get( "id" ) ) ).getResultList();
122+
123+
assertThat( resultList ).hasSize( 4 ).allSatisfy( Assertions::assertNotNull );
124+
125+
em.getTransaction().commit();
126+
}
127+
128+
@Test
129+
public void testQueryForRevisionsOfEntity() {
130+
final EntityManager em = getEntityManager();
131+
em.getTransaction().begin();
132+
133+
//noinspection unchecked
134+
final List<Object> resultList = getAuditReader().createQuery()
135+
.forRevisionsOfEntity( StrIntTestEntity.class, true )
136+
.add( AuditEntity.id().eq( 1 ) )
137+
.add( AuditEntity.revisionNumber().between( 1, 3 ) )
138+
.getResultList();
139+
140+
assertThat( resultList ).hasSize( 2 ).allMatch( r -> r instanceof SequenceIdRevisionEntity );
141+
142+
em.getTransaction().commit();
143+
}
144+
}

0 commit comments

Comments
 (0)