HHH-16565 Add test for issue

This commit is contained in:
Marco Belladelli 2023-05-16 13:15:31 +02:00
parent 2e502215d5
commit f0affe7804
1 changed files with 65 additions and 0 deletions

View File

@ -0,0 +1,65 @@
/*
* Hibernate, Relational Persistence for Idiomatic Java
*
* License: GNU Lesser General Public License (LGPL), version 2.1 or later
* See the lgpl.txt file in the root directory or http://www.gnu.org/licenses/lgpl-2.1.html
*/
package org.hibernate.orm.test.cache.polymorphism;
import java.util.List;
import org.hibernate.CacheMode;
import org.hibernate.cache.spi.CacheImplementor;
import org.hibernate.cfg.AvailableSettings;
import org.hibernate.testing.orm.junit.Jira;
import org.hibernate.testing.orm.junit.ServiceRegistry;
import org.hibernate.testing.orm.junit.SessionFactoryScope;
import org.hibernate.testing.orm.junit.Setting;
import org.junit.jupiter.api.Test;
import static org.assertj.core.api.Assertions.assertThat;
/**
* Note: when batch fetching a single id this might not happen since in some cases
* we use a single ID entity loader that does not read the result from the PC but
* directly from the result of the query.
* <p>
* With multi-load, however, the problem is always apparent.
*
* @author Marco Belladelli
*/
@ServiceRegistry( settings = @Setting( name = AvailableSettings.DEFAULT_BATCH_FETCH_SIZE, value = "10" ) )
@Jira( "https://hibernate.atlassian.net/browse/HHH-16565" )
public class PolymorphicCacheAndBatchingTest extends PolymorphicCacheTest {
@Test
public void testMultiLoad(SessionFactoryScope scope) {
final CacheImplementor cache = scope.getSessionFactory().getCache();
assertThat( cache.containsEntity( CachedItem1.class, 1 ) ).isTrue();
assertThat( cache.containsEntity( CachedItem2.class, 2 ) ).isTrue();
// test accessing the wrong class by id with a cache-hit
scope.inTransaction( session -> {
final List<CachedItem2> resultList = session.byMultipleIds( CachedItem2.class )
.with( CacheMode.NORMAL )
.enableSessionCheck( true )
.multiLoad( 1, 2 );
assertThat( resultList ).hasSize( 2 );
assertThat( resultList.get( 0 ) ).isNull();
assertThat( resultList.get( 1 ).getName() ).isEqualTo( "name 2" );
} );
// test accessing the wrong class by id with no cache-hit
cache.evictEntityData();
scope.inTransaction( (session) -> {
final List<CachedItem2> resultList = session.byMultipleIds( CachedItem2.class )
.with( CacheMode.NORMAL )
.enableSessionCheck( true )
.multiLoad( 1, 2 );
assertThat( resultList ).hasSize( 2 );
assertThat( resultList.get( 0 ) ).isNull();
assertThat( resultList.get( 1 ).getName() ).isEqualTo( "name 2" );
} );
}
}