Skip to content

Commit d52f2ab

Browse files
committed
HHH-19393 Modified existing test case to use explicitely defined IdClass implemented as Java record
1 parent ed818cb commit d52f2ab

File tree

1 file changed

+254
-0
lines changed

1 file changed

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

0 commit comments

Comments
 (0)