HHH-7572 - Develop API for load-by-multiple-ids
This commit is contained in:
parent
134eb06fba
commit
67e631dfb3
|
@ -152,6 +152,19 @@ public class BatchFetchQueue {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Intended for test usage. Really has no use-case in Hibernate proper.
|
||||||
|
*/
|
||||||
|
public boolean containsEntityKey(EntityKey key) {
|
||||||
|
if ( key.isBatchLoadable() ) {
|
||||||
|
LinkedHashSet<EntityKey> set = batchLoadableEntityKeys.get( key.getEntityName());
|
||||||
|
if ( set != null ) {
|
||||||
|
return set.contains( key );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get a batch of unloaded identifiers for this class, using a slightly
|
* Get a batch of unloaded identifiers for this class, using a slightly
|
||||||
* complex algorithm that tries to grab keys registered immediately after
|
* complex algorithm that tries to grab keys registered immediately after
|
||||||
|
|
|
@ -15,10 +15,13 @@ import javax.persistence.Table;
|
||||||
|
|
||||||
import org.hibernate.CacheMode;
|
import org.hibernate.CacheMode;
|
||||||
import org.hibernate.Session;
|
import org.hibernate.Session;
|
||||||
|
import org.hibernate.annotations.BatchSize;
|
||||||
import org.hibernate.boot.MetadataBuilder;
|
import org.hibernate.boot.MetadataBuilder;
|
||||||
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
|
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
|
||||||
import org.hibernate.cache.spi.access.AccessType;
|
import org.hibernate.cache.spi.access.AccessType;
|
||||||
import org.hibernate.cfg.AvailableSettings;
|
import org.hibernate.cfg.AvailableSettings;
|
||||||
|
import org.hibernate.engine.spi.EntityKey;
|
||||||
|
import org.hibernate.engine.spi.SessionImplementor;
|
||||||
|
|
||||||
import org.hibernate.testing.junit4.BaseNonConfigCoreFunctionalTestCase;
|
import org.hibernate.testing.junit4.BaseNonConfigCoreFunctionalTestCase;
|
||||||
import org.junit.After;
|
import org.junit.After;
|
||||||
|
@ -28,6 +31,7 @@ import org.junit.Test;
|
||||||
import static org.junit.Assert.assertEquals;
|
import static org.junit.Assert.assertEquals;
|
||||||
import static org.junit.Assert.assertFalse;
|
import static org.junit.Assert.assertFalse;
|
||||||
import static org.junit.Assert.assertSame;
|
import static org.junit.Assert.assertSame;
|
||||||
|
import static org.junit.Assert.assertTrue;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Steve Ebersole
|
* @author Steve Ebersole
|
||||||
|
@ -129,6 +133,29 @@ public class MultiLoadTest extends BaseNonConfigCoreFunctionalTestCase {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testMultiLoadClearsBatchFetchQueue() {
|
||||||
|
final EntityKey entityKey = new EntityKey(
|
||||||
|
1,
|
||||||
|
sessionFactory().getEntityPersister( SimpleEntity.class.getName() )
|
||||||
|
);
|
||||||
|
|
||||||
|
Session session = openSession();
|
||||||
|
session.getTransaction().begin();
|
||||||
|
// create a proxy, which should add an entry to the BatchFetchQueue
|
||||||
|
SimpleEntity first = session.byId( SimpleEntity.class ).getReference( 1 );
|
||||||
|
assertTrue( ( (SessionImplementor) session ).getPersistenceContext().getBatchFetchQueue().containsEntityKey( entityKey ) );
|
||||||
|
|
||||||
|
// now bulk load, which should clean up the BatchFetchQueue entry
|
||||||
|
List<SimpleEntity> list = session.byMultipleIds( SimpleEntity.class ).enableSessionCheck( true ).multiLoad( ids(56) );
|
||||||
|
|
||||||
|
assertEquals( 56, list.size() );
|
||||||
|
assertFalse( ( (SessionImplementor) session ).getPersistenceContext().getBatchFetchQueue().containsEntityKey( entityKey ) );
|
||||||
|
|
||||||
|
session.getTransaction().commit();
|
||||||
|
session.close();
|
||||||
|
}
|
||||||
|
|
||||||
private Integer[] ids(int count) {
|
private Integer[] ids(int count) {
|
||||||
Integer[] ids = new Integer[count];
|
Integer[] ids = new Integer[count];
|
||||||
for ( int i = 1; i <= count; i++ ) {
|
for ( int i = 1; i <= count; i++ ) {
|
||||||
|
@ -140,6 +167,7 @@ public class MultiLoadTest extends BaseNonConfigCoreFunctionalTestCase {
|
||||||
@Entity( name = "SimpleEntity" )
|
@Entity( name = "SimpleEntity" )
|
||||||
@Table( name = "SimpleEntity" )
|
@Table( name = "SimpleEntity" )
|
||||||
@Cacheable()
|
@Cacheable()
|
||||||
|
@BatchSize( size = 15 )
|
||||||
public static class SimpleEntity {
|
public static class SimpleEntity {
|
||||||
Integer id;
|
Integer id;
|
||||||
String text;
|
String text;
|
||||||
|
|
Loading…
Reference in New Issue