Skip to content

Commit 3ccb6d9

Browse files
cigalymbellade
authored andcommitted
HHH-19393 Add test for issue
1 parent 2145c56 commit 3ccb6d9

File tree

1 file changed

+251
-0
lines changed

1 file changed

+251
-0
lines changed
Lines changed: 251 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,251 @@
1+
/*
2+
* SPDX-License-Identifier: Apache-2.0
3+
* Copyright Red Hat Inc. and Hibernate Authors
4+
*/
5+
package org.hibernate.envers.test.integration.query.ids;
6+
7+
import java.io.Serializable;
8+
import java.util.Arrays;
9+
import java.util.List;
10+
11+
import jakarta.persistence.Entity;
12+
import jakarta.persistence.Id;
13+
import jakarta.persistence.IdClass;
14+
import jakarta.persistence.ManyToOne;
15+
16+
import org.hibernate.annotations.processing.Exclude;
17+
import org.hibernate.envers.Audited;
18+
import org.hibernate.envers.RevisionType;
19+
import org.hibernate.envers.query.AuditEntity;
20+
import org.hibernate.orm.test.envers.BaseEnversJPAFunctionalTestCase;
21+
import org.hibernate.orm.test.envers.Priority;
22+
import org.hibernate.testing.orm.junit.Jira;
23+
import org.junit.Test;
24+
25+
import org.hibernate.testing.transaction.TransactionUtil;
26+
27+
import static org.junit.Assert.assertEquals;
28+
import static org.junit.Assert.assertNull;
29+
30+
@Exclude
31+
@Jira("https://hibernate.atlassian.net/browse/HHH-19393")
32+
public class RecordIdRelatedIdQueryTest extends BaseEnversJPAFunctionalTestCase {
33+
34+
@Override
35+
protected Class<?>[] getAnnotatedClasses() {
36+
return new Class<?>[] { Person.class, Document.class, PersonDocument.class };
37+
}
38+
39+
@Test
40+
@Priority(10)
41+
public void initData() {
42+
TransactionUtil.doInJPA( this::entityManagerFactory, entityManager -> {
43+
final Person person = new Person( 1, "Chris" );
44+
final Document document = new Document( 1, "DL" );
45+
final PersonDocument pd = new PersonDocument( person, document );
46+
entityManager.persist( person );
47+
entityManager.persist( document );
48+
entityManager.persist( pd );
49+
} );
50+
51+
TransactionUtil.doInJPA( this::entityManagerFactory, entityManager -> {
52+
final Person person = entityManager.find( Person.class, 1 );
53+
final Document document = new Document( 2, "Passport" );
54+
final PersonDocument pd = new PersonDocument( person, document );
55+
entityManager.persist( document );
56+
entityManager.persist( pd );
57+
} );
58+
59+
TransactionUtil.doInJPA( this::entityManagerFactory, entityManager -> {
60+
final Person person = entityManager.find( Person.class, 1 );
61+
final Document document = entityManager.find( Document.class, 1 );
62+
final PersonDocument pd = entityManager
63+
.createQuery( "FROM PersonDocument WHERE person.id = :person AND document.id = :document", PersonDocument.class )
64+
.setParameter( "person", person.getId() )
65+
.setParameter( "document", document.getId() )
66+
.getSingleResult();
67+
68+
entityManager.remove( pd );
69+
entityManager.remove( document );
70+
} );
71+
}
72+
73+
@Test
74+
public void testRevisionCounts() {
75+
assertEquals( Arrays.asList( 1 ), getAuditReader().getRevisions( Person.class, 1 ) );
76+
assertEquals( Arrays.asList( 1, 3 ), getAuditReader().getRevisions( Document.class, 1 ) );
77+
assertEquals( Arrays.asList( 2 ), getAuditReader().getRevisions( Document.class, 2 ) );
78+
}
79+
80+
@Test
81+
public void testRelatedIdQueries() {
82+
TransactionUtil.doInJPA( this::entityManagerFactory, entityManager -> {
83+
List results = getAuditReader().createQuery().forRevisionsOfEntity( PersonDocument.class, false, true )
84+
.add( AuditEntity.relatedId( "person" ).eq( 1 ) )
85+
.add( AuditEntity.revisionNumber().eq( 1 ) )
86+
.getResultList();
87+
assertEquals( 1, results.size() );
88+
final Document document = ( (PersonDocument) ( (Object[]) results.get( 0 ) )[0] ).getDocument();
89+
assertEquals( "DL", document.getName() );
90+
} );
91+
92+
TransactionUtil.doInJPA( this::entityManagerFactory, entityManager -> {
93+
List results = getAuditReader().createQuery().forRevisionsOfEntity( PersonDocument.class, false, true )
94+
.add( AuditEntity.relatedId( "person" ).eq( 1 ) )
95+
.add( AuditEntity.revisionNumber().eq( 2 ) )
96+
.getResultList();
97+
assertEquals( 1, results.size() );
98+
final Document document = ( (PersonDocument) ( (Object[]) results.get( 0 ) )[0] ).getDocument();
99+
assertEquals( "Passport", document.getName() );
100+
} );
101+
102+
TransactionUtil.doInJPA( this::entityManagerFactory, entityManager -> {
103+
List results = getAuditReader().createQuery().forRevisionsOfEntity( PersonDocument.class, false, true )
104+
.add( AuditEntity.relatedId( "person" ).eq( 1 ) )
105+
.add( AuditEntity.revisionNumber().eq( 3 ) )
106+
.getResultList();
107+
assertEquals( 1, results.size() );
108+
final Document document = ( (PersonDocument) ( (Object[]) results.get( 0 ) )[0] ).getDocument();
109+
assertNull( document.getName() );
110+
} );
111+
112+
TransactionUtil.doInJPA( this::entityManagerFactory, entityManager -> {
113+
List results = getAuditReader().createQuery().forRevisionsOfEntity( PersonDocument.class, false, true )
114+
.add( AuditEntity.relatedId( "document" ).eq( 1 ) )
115+
.getResultList();
116+
assertEquals( 2, results.size() );
117+
for ( Object result : results ) {
118+
Object[] row = (Object[]) result;
119+
final RevisionType revisionType = (RevisionType) row[2];
120+
final Document document = ( (PersonDocument) row[0] ).getDocument();
121+
if ( RevisionType.ADD.equals( revisionType ) ) {
122+
assertEquals( "DL", document.getName() );
123+
}
124+
else if ( RevisionType.DEL.equals( revisionType ) ) {
125+
assertNull( document.getName() );
126+
}
127+
}
128+
} );
129+
130+
TransactionUtil.doInJPA( this::entityManagerFactory, entityManager -> {
131+
List results = getAuditReader().createQuery().forRevisionsOfEntity( PersonDocument.class, false, true )
132+
.add( AuditEntity.relatedId( "document" ).eq( 2 ) )
133+
.getResultList();
134+
assertEquals( 1, results.size() );
135+
for ( Object result : results ) {
136+
Object[] row = (Object[]) result;
137+
final RevisionType revisionType = (RevisionType) row[2];
138+
final Document document = ( (PersonDocument) row[0] ).getDocument();
139+
assertEquals( RevisionType.ADD, revisionType );
140+
assertEquals( "Passport", document.getName() );
141+
}
142+
} );
143+
}
144+
145+
@Audited
146+
@Entity(name = "PersonDocument")
147+
@IdClass( PersonDocumentId.class )
148+
public static class PersonDocument implements Serializable {
149+
@Id
150+
@ManyToOne(optional = false)
151+
private Document document;
152+
153+
@Id
154+
@ManyToOne(optional = false)
155+
private Person person;
156+
157+
PersonDocument() {
158+
159+
}
160+
161+
PersonDocument(Person person, Document document) {
162+
this.document = document;
163+
this.person = person;
164+
}
165+
166+
public Document getDocument() {
167+
return document;
168+
}
169+
170+
public void setDocument(Document document) {
171+
this.document = document;
172+
}
173+
174+
public Person getPerson() {
175+
return person;
176+
}
177+
178+
public void setPerson(Person person) {
179+
this.person = person;
180+
}
181+
}
182+
183+
public record PersonDocumentId(Document document, Person person) {
184+
}
185+
186+
@Audited
187+
@Entity(name = "Document")
188+
public static class Document {
189+
@Id
190+
private Integer id;
191+
private String name;
192+
193+
Document() {
194+
195+
}
196+
197+
Document(Integer id, String name) {
198+
this.id = id;
199+
this.name = name;
200+
}
201+
202+
public Integer getId() {
203+
return id;
204+
}
205+
206+
public void setId(Integer id) {
207+
this.id = id;
208+
}
209+
210+
public String getName() {
211+
return name;
212+
}
213+
214+
public void setName(String name) {
215+
this.name = name;
216+
}
217+
}
218+
219+
@Entity(name = "Person")
220+
@Audited
221+
public static class Person {
222+
@Id
223+
private Integer id;
224+
private String name;
225+
226+
Person() {
227+
228+
}
229+
230+
Person(Integer id, String name) {
231+
this.id = id;
232+
this.name = name;
233+
}
234+
235+
public Integer getId() {
236+
return id;
237+
}
238+
239+
public void setId(Integer id) {
240+
this.id = id;
241+
}
242+
243+
public String getName() {
244+
return name;
245+
}
246+
247+
public void setName(String name) {
248+
this.name = name;
249+
}
250+
}
251+
}

0 commit comments

Comments
 (0)