Skip to content

Commit b20cdf1

Browse files
committed
HHH-19829 - replicate some existing tests in MultiLoadTest to use findMultiple instead of byMultipleIds, thus covering the newly introduced MultiFindOptions
Signed-off-by: Jan Schatteman <[email protected]>
1 parent 11c6f4d commit b20cdf1

File tree

1 file changed

+217
-24
lines changed

1 file changed

+217
-24
lines changed

hibernate-core/src/test/java/org/hibernate/orm/test/loading/multiLoad/MultiLoadTest.java

Lines changed: 217 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,15 @@
44
*/
55
package org.hibernate.orm.test.loading.multiLoad;
66

7+
import java.util.ArrayList;
78
import java.util.List;
89
import java.util.Objects;
910

1011
import org.hibernate.CacheMode;
1112
import org.hibernate.Hibernate;
13+
import org.hibernate.IncludeRemovals;
14+
import org.hibernate.OrderedReturn;
15+
import org.hibernate.SessionChecking;
1216
import org.hibernate.annotations.BatchSize;
1317
import org.hibernate.cache.spi.access.AccessType;
1418
import org.hibernate.cfg.AvailableSettings;
@@ -37,13 +41,13 @@
3741
import jakarta.persistence.Table;
3842

3943
import static org.hamcrest.CoreMatchers.is;
40-
import static org.junit.Assert.assertEquals;
41-
import static org.junit.Assert.assertFalse;
42-
import static org.junit.Assert.assertNotNull;
43-
import static org.junit.Assert.assertNull;
44-
import static org.junit.Assert.assertSame;
45-
import static org.junit.Assert.assertThat;
46-
import static org.junit.Assert.assertTrue;
44+
import static org.hamcrest.MatcherAssert.assertThat;
45+
import static org.junit.jupiter.api.Assertions.assertEquals;
46+
import static org.junit.jupiter.api.Assertions.assertFalse;
47+
import static org.junit.jupiter.api.Assertions.assertNotNull;
48+
import static org.junit.jupiter.api.Assertions.assertNull;
49+
import static org.junit.jupiter.api.Assertions.assertSame;
50+
import static org.junit.jupiter.api.Assertions.assertTrue;
4751

4852
/**
4953
* @author Steve Ebersole
@@ -86,7 +90,7 @@ public void testBasicMultiLoad(SessionFactoryScope scope) {
8690
final SQLStatementInspector statementInspector = scope.getCollectingStatementInspector();
8791
scope.inTransaction(
8892
session -> {
89-
statementInspector.getSqlQueries().clear();
93+
statementInspector.clear();
9094

9195
List<SimpleEntity> list = session.byMultipleIds( SimpleEntity.class ).multiLoad( ids( 5 ) );
9296
assertEquals( 5, list.size() );
@@ -218,6 +222,9 @@ public void testDuplicatedRequestedIdswithDisableOrderedReturn(SessionFactorySco
218222
.enableOrderedReturn( false )
219223
.multiLoad( 1, 2, 3, 2, 2 );
220224
assertEquals( 3, list.size() );
225+
226+
list = session.findMultiple( SimpleEntity.class, List.of( 1, 2, 3, 2, 2 ), OrderedReturn.UNORDERED );
227+
assertEquals( 3, list.size() );
221228
}
222229
);
223230
}
@@ -235,6 +242,9 @@ public void testNonExistentIdRequest(SessionFactoryScope scope) {
235242
// un-ordered multiLoad
236243
list = session.byMultipleIds( SimpleEntity.class ).enableOrderedReturn( false ).multiLoad( 1, 699, 2 );
237244
assertEquals( 2, list.size() );
245+
246+
list = session.findMultiple( SimpleEntity.class, List.of(1, 699, 2), OrderedReturn.UNORDERED );
247+
assertEquals( 2, list.size() );
238248
}
239249
);
240250
}
@@ -265,6 +275,12 @@ public void testBasicMultiLoadWithManagedAndChecking(SessionFactoryScope scope)
265275
// this check is HIGHLY specific to implementation in the batch loader
266276
// which puts existing managed entities first...
267277
assertSame( first, list.get( 0 ) );
278+
279+
list = session.findMultiple( SimpleEntity.class, idList(56), SessionChecking.ENABLED );
280+
assertEquals( 56, list.size() );
281+
// this check is HIGHLY specific to implementation in the batch loader
282+
// which puts existing managed entities first...
283+
assertSame( first, list.get( 0 ) );
268284
}
269285
);
270286
}
@@ -295,6 +311,15 @@ public void testBasicMultiLoadWithManagedAndCheckingProxied(SessionFactoryScope
295311
// this check is HIGHLY specific to implementation in the batch loader
296312
// which puts existing managed entities first...
297313
assertSame( first, list.get( 0 ) );
314+
315+
session.evict( first );
316+
first = session.byId( SimpleEntity.class ).getReference( 1 );
317+
318+
list = session.findMultiple( SimpleEntity.class, idList(56), SessionChecking.ENABLED );
319+
assertEquals( 56, list.size() );
320+
// this check is HIGHLY specific to implementation in the batch loader
321+
// which puts existing managed entities first...
322+
assertSame( first, list.get( 0 ) );
298323
}
299324
);
300325
}
@@ -330,7 +355,7 @@ public void testMultiLoadFrom2ndLevelCache(SessionFactoryScope scope) {
330355
// Validate that the entity is still in the Level 2 cache
331356
assertTrue( session.getSessionFactory().getCache().containsEntity( SimpleEntity.class, 2 ) );
332357

333-
statementInspector.getSqlQueries().clear();
358+
statementInspector.clear();
334359

335360
// Multiload 3 items and ensure that multiload pulls 2 from the database & 1 from the cache.
336361
List<SimpleEntity> entities = session.byMultipleIds( SimpleEntity.class )
@@ -344,12 +369,37 @@ public void testMultiLoadFrom2ndLevelCache(SessionFactoryScope scope) {
344369
assertTrue( session.contains( entity ) );
345370
}
346371

347-
final int paramCount = StringHelper.countUnquoted(
372+
int paramCount = StringHelper.countUnquoted(
348373
statementInspector.getSqlQueries().get( 0 ),
349374
'?'
350375
);
351376

352-
final Dialect dialect = session.getSessionFactory().getJdbcServices().getDialect();
377+
Dialect dialect = session.getSessionFactory().getJdbcServices().getDialect();
378+
if ( MultiKeyLoadHelper.supportsSqlArrayType( dialect ) ) {
379+
assertThat( paramCount, is( 1 ) );
380+
}
381+
else {
382+
assertThat( paramCount, is( 2 ) );
383+
}
384+
385+
// Multiload 3 items and ensure that multiload pulls 2 from the database & 1 from the cache.
386+
entities = session.findMultiple( SimpleEntity.class, idList(3),
387+
CacheMode.NORMAL,
388+
SessionChecking.ENABLED
389+
);
390+
assertEquals( 3, entities.size() );
391+
assertEquals( 1, statistics.getSecondLevelCacheHitCount() );
392+
393+
for(SimpleEntity entity: entities) {
394+
assertTrue( session.contains( entity ) );
395+
}
396+
397+
paramCount = StringHelper.countUnquoted(
398+
statementInspector.getSqlQueries().get( 0 ),
399+
'?'
400+
);
401+
402+
dialect = session.getSessionFactory().getJdbcServices().getDialect();
353403
if ( MultiKeyLoadHelper.supportsSqlArrayType( dialect ) ) {
354404
assertThat( paramCount, is( 1 ) );
355405
}
@@ -392,7 +442,7 @@ public void testUnorderedMultiLoadFrom2ndLevelCache(SessionFactoryScope scope) {
392442
// Validate that the entity is still in the Level 2 cache
393443
assertTrue( session.getSessionFactory().getCache().containsEntity( SimpleEntity.class, 2 ) );
394444

395-
statementInspector.getSqlQueries().clear();
445+
statementInspector.clear();
396446

397447
// Multiload 3 items and ensure that multiload pulls 2 from the database & 1 from the cache.
398448
List<SimpleEntity> entities = session.byMultipleIds( SimpleEntity.class )
@@ -406,12 +456,37 @@ public void testUnorderedMultiLoadFrom2ndLevelCache(SessionFactoryScope scope) {
406456
for ( SimpleEntity entity : entities ) {
407457
assertTrue( session.contains( entity ) );
408458
}
409-
final int paramCount = StringHelper.countUnquoted(
459+
int paramCount = StringHelper.countUnquoted(
460+
statementInspector.getSqlQueries().get( 0 ),
461+
'?'
462+
);
463+
464+
Dialect dialect = session.getSessionFactory().getJdbcServices().getDialect();
465+
if ( MultiKeyLoadHelper.supportsSqlArrayType( dialect ) ) {
466+
assertThat( paramCount, is( 1 ) );
467+
}
468+
else {
469+
assertThat( paramCount, is( 2 ) );
470+
}
471+
472+
// Multiload 3 items and ensure that multiload pulls 2 from the database & 1 from the cache.
473+
entities = session.findMultiple( SimpleEntity.class, idList(3),
474+
CacheMode.NORMAL,
475+
SessionChecking.ENABLED,
476+
OrderedReturn.UNORDERED
477+
);
478+
assertEquals( 3, entities.size() );
479+
assertEquals( 1, statistics.getSecondLevelCacheHitCount() );
480+
481+
for ( SimpleEntity entity : entities ) {
482+
assertTrue( session.contains( entity ) );
483+
}
484+
paramCount = StringHelper.countUnquoted(
410485
statementInspector.getSqlQueries().get( 0 ),
411486
'?'
412487
);
413488

414-
final Dialect dialect = session.getSessionFactory().getJdbcServices().getDialect();
489+
dialect = session.getSessionFactory().getJdbcServices().getDialect();
415490
if ( MultiKeyLoadHelper.supportsSqlArrayType( dialect ) ) {
416491
assertThat( paramCount, is( 1 ) );
417492
}
@@ -444,12 +519,35 @@ public void testOrderedMultiLoadFrom2ndLevelCachePendingDelete(SessionFactorySco
444519

445520
assertNull( entities.get( 1 ) );
446521

447-
final int paramCount = StringHelper.countUnquoted(
522+
int paramCount = StringHelper.countUnquoted(
448523
statementInspector.getSqlQueries().get( 0 ),
449524
'?'
450525
);
451526

452-
final Dialect dialect = session.getSessionFactory().getJdbcServices().getDialect();
527+
Dialect dialect = session.getSessionFactory().getJdbcServices().getDialect();
528+
if ( MultiKeyLoadHelper.supportsSqlArrayType( dialect ) ) {
529+
assertThat( paramCount, is( 1 ) );
530+
}
531+
else {
532+
assertThat( paramCount, is( 2 ) );
533+
}
534+
535+
// Multi-load 3 items and ensure that it pulls 2 from the database & 1 from the cache.
536+
entities = session.findMultiple( SimpleEntity.class, idList(3),
537+
CacheMode.NORMAL,
538+
SessionChecking.ENABLED,
539+
OrderedReturn.ORDERED
540+
);
541+
assertEquals( 3, entities.size() );
542+
543+
assertNull( entities.get( 1 ) );
544+
545+
paramCount = StringHelper.countUnquoted(
546+
statementInspector.getSqlQueries().get( 0 ),
547+
'?'
548+
);
549+
550+
dialect = session.getSessionFactory().getJdbcServices().getDialect();
453551
if ( MultiKeyLoadHelper.supportsSqlArrayType( dialect ) ) {
454552
assertThat( paramCount, is( 1 ) );
455553
}
@@ -484,16 +582,45 @@ public void testOrderedMultiLoadFrom2ndLevelCachePendingDeleteReturnRemoved(Sess
484582
SimpleEntity deletedEntity = entities.get( 1 );
485583
assertNotNull( deletedEntity );
486584

487-
final EntityEntry entry = session.getPersistenceContext()
585+
EntityEntry entry = session.getPersistenceContext()
488586
.getEntry( deletedEntity );
489587
assertTrue( entry.getStatus().isDeletedOrGone() );
490588

491-
final int paramCount = StringHelper.countUnquoted(
589+
int paramCount = StringHelper.countUnquoted(
590+
statementInspector.getSqlQueries().get( 0 ),
591+
'?'
592+
);
593+
594+
Dialect dialect = session.getSessionFactory().getJdbcServices().getDialect();
595+
if ( MultiKeyLoadHelper.supportsSqlArrayType( dialect ) ) {
596+
assertThat( paramCount, is( 1 ) );
597+
}
598+
else {
599+
assertThat( paramCount, is( 2 ) );
600+
}
601+
602+
// Multiload 3 items and ensure that multiload pulls 2 from the database & 1 from the cache.
603+
entities = session.findMultiple( SimpleEntity.class, idList( 3 ),
604+
CacheMode.NORMAL,
605+
SessionChecking.ENABLED,
606+
OrderedReturn.ORDERED,
607+
IncludeRemovals.INCLUDE
608+
);
609+
assertEquals( 3, entities.size() );
610+
611+
deletedEntity = entities.get( 1 );
612+
assertNotNull( deletedEntity );
613+
614+
entry = session.getPersistenceContext()
615+
.getEntry( deletedEntity );
616+
assertTrue( entry.getStatus().isDeletedOrGone() );
617+
618+
paramCount = StringHelper.countUnquoted(
492619
statementInspector.getSqlQueries().get( 0 ),
493620
'?'
494621
);
495622

496-
final Dialect dialect = session.getSessionFactory().getJdbcServices().getDialect();
623+
dialect = session.getSessionFactory().getJdbcServices().getDialect();
497624
if ( MultiKeyLoadHelper.supportsSqlArrayType( dialect ) ) {
498625
assertThat( paramCount, is( 1 ) );
499626
}
@@ -525,12 +652,35 @@ public void testUnorderedMultiLoadFrom2ndLevelCachePendingDelete(SessionFactoryS
525652

526653
assertTrue( entities.stream().anyMatch( Objects::isNull ) );
527654

528-
final int paramCount = StringHelper.countUnquoted(
655+
int paramCount = StringHelper.countUnquoted(
656+
statementInspector.getSqlQueries().get( 0 ),
657+
'?'
658+
);
659+
660+
Dialect dialect = session.getSessionFactory().getJdbcServices().getDialect();
661+
if ( MultiKeyLoadHelper.supportsSqlArrayType( dialect ) ) {
662+
assertThat( paramCount, is( 1 ) );
663+
}
664+
else {
665+
assertThat( paramCount, is( 2 ) );
666+
}
667+
668+
// Multiload 3 items and ensure that multiload pulls 2 from the database & 1 from the cache.
669+
entities = session.findMultiple( SimpleEntity.class, idList(3),
670+
CacheMode.NORMAL,
671+
SessionChecking.ENABLED,
672+
OrderedReturn.UNORDERED
673+
);
674+
assertEquals( 3, entities.size() );
675+
676+
assertTrue( entities.stream().anyMatch( Objects::isNull ) );
677+
678+
paramCount = StringHelper.countUnquoted(
529679
statementInspector.getSqlQueries().get( 0 ),
530680
'?'
531681
);
532682

533-
final Dialect dialect = session.getSessionFactory().getJdbcServices().getDialect();
683+
dialect = session.getSessionFactory().getJdbcServices().getDialect();
534684
if ( MultiKeyLoadHelper.supportsSqlArrayType( dialect ) ) {
535685
assertThat( paramCount, is( 1 ) );
536686
}
@@ -565,15 +715,44 @@ public void testUnorderedMultiLoadFrom2ndLevelCachePendingDeleteReturnRemoved(Se
565715
.equals( 2 ) ).findAny().orElse( null );
566716
assertNotNull( deletedEntity );
567717

568-
final EntityEntry entry = session.getPersistenceContext().getEntry( deletedEntity );
718+
EntityEntry entry = session.getPersistenceContext().getEntry( deletedEntity );
569719
assertTrue( entry.getStatus().isDeletedOrGone() );
570720

571-
final int paramCount = StringHelper.countUnquoted(
721+
int paramCount = StringHelper.countUnquoted(
722+
statementInspector.getSqlQueries().get( 0 ),
723+
'?'
724+
);
725+
726+
Dialect dialect = session.getSessionFactory().getJdbcServices().getDialect();
727+
if ( MultiKeyLoadHelper.supportsSqlArrayType( dialect ) ) {
728+
assertThat( paramCount, is( 1 ) );
729+
}
730+
else {
731+
assertThat( paramCount, is( 2 ) );
732+
}
733+
734+
// Multiload 3 items and ensure that multiload pulls 2 from the database & 1 from the cache.
735+
entities = session.findMultiple( SimpleEntity.class, idList(3),
736+
CacheMode.NORMAL,
737+
SessionChecking.ENABLED,
738+
OrderedReturn.UNORDERED,
739+
IncludeRemovals.INCLUDE
740+
);
741+
assertEquals( 3, entities.size() );
742+
743+
deletedEntity = entities.stream().filter( simpleEntity -> simpleEntity.getId()
744+
.equals( 2 ) ).findAny().orElse( null );
745+
assertNotNull( deletedEntity );
746+
747+
entry = session.getPersistenceContext().getEntry( deletedEntity );
748+
assertTrue( entry.getStatus().isDeletedOrGone() );
749+
750+
paramCount = StringHelper.countUnquoted(
572751
statementInspector.getSqlQueries().get( 0 ),
573752
'?'
574753
);
575754

576-
final Dialect dialect = session.getSessionFactory().getJdbcServices().getDialect();
755+
dialect = session.getSessionFactory().getJdbcServices().getDialect();
577756
if ( MultiKeyLoadHelper.supportsSqlArrayType( dialect ) ) {
578757
assertThat( paramCount, is( 1 ) );
579758
}
@@ -624,6 +803,12 @@ public void testMultiLoadClearsBatchFetchQueue(SessionFactoryScope scope) {
624803
.getBatchFetchQueue()
625804
.containsEntityKey( entityKey ) );
626805

806+
list = session.findMultiple( SimpleEntity.class, idList(56), SessionChecking.ENABLED );
807+
808+
assertEquals( 56, list.size() );
809+
assertFalse( session.getPersistenceContext()
810+
.getBatchFetchQueue()
811+
.containsEntityKey( entityKey ) );
627812
}
628813
);
629814
}
@@ -636,6 +821,14 @@ private Integer[] ids(int count) {
636821
return ids;
637822
}
638823

824+
private List<Integer> idList(int count) {
825+
List<Integer> ids = new ArrayList<>(count);
826+
for ( int i = 1; i <= count; i++ ) {
827+
ids.add(i);
828+
}
829+
return ids;
830+
}
831+
639832
@Entity( name = "SimpleEntity" )
640833
@Table( name = "SimpleEntity" )
641834
@Cacheable()

0 commit comments

Comments
 (0)