Fetching an element collection on an entity with a composite id fails when batch size > 1

Description

With hibernate.default_batch_fetch_size setting set to a value > 1

Having a model like:

@Entity(name = "EntityA") public class EntityA { @EmbeddedId private EntityId id; @ElementCollection public Set<EmbeddableA> elementCollection = new HashSet<>(); } @Entity(name = "EntityB") public class EntityB { @Id private Long id; } @Embeddable public class EntityId implements Serializable { private String id1; @ManyToOne @MapsId private EntityB id2; } @Embeddable public class EmbeddableA { private String name; }

Trying to access element collection:

EntityA a = entityManager.find( EntityA.class, ENTITY_A_ID ); a.elementCollection.size();

Leads to:

java.lang.NullPointerException at org.hibernate.sql.results.graph.entity.internal.BatchEntityInsideEmbeddableSelectFetchInitializer.getRootEmbeddablePropertyName(BatchEntityInsideEmbeddableSelectFetchInitializer.java:190) at org.hibernate.sql.results.graph.entity.internal.BatchEntityInsideEmbeddableSelectFetchInitializer.<init>(BatchEntityInsideEmbeddableSelectFetchInitializer.java:57) at org.hibernate.sql.results.graph.entity.internal.EntitySelectFetchInitializerBuilder.createInitializer(EntitySelectFetchInitializerBuilder.java:62) at org.hibernate.sql.results.graph.entity.internal.EntityFetchSelectImpl.buildEntitySelectFetchInitializer(EntityFetchSelectImpl.java:92) at org.hibernate.sql.results.graph.entity.internal.EntityFetchSelectImpl.lambda$createAssembler$0(EntityFetchSelectImpl.java:70) at org.hibernate.sql.results.internal.ResultsHelper$1.resolveInitializer(ResultsHelper.java:117) at org.hibernate.sql.results.graph.entity.internal.EntityFetchSelectImpl.createAssembler(EntityFetchSelectImpl.java:67) at org.hibernate.sql.results.graph.embeddable.AbstractEmbeddableInitializer.createAssemblers(AbstractEmbeddableInitializer.java:109) at org.hibernate.sql.results.graph.embeddable.AbstractEmbeddableInitializer.<init>(AbstractEmbeddableInitializer.java:75) at org.hibernate.sql.results.graph.embeddable.internal.EmbeddableResultInitializer.<init>(EmbeddableResultInitializer.java:22) at org.hibernate.sql.results.graph.embeddable.internal.EmbeddableForeignKeyResultImpl.lambda$createResultAssembler$0(EmbeddableForeignKeyResultImpl.java:104) at org.hibernate.sql.results.internal.ResultsHelper$1.resolveInitializer(ResultsHelper.java:117) at org.hibernate.sql.results.graph.embeddable.internal.EmbeddableForeignKeyResultImpl.createResultAssembler(EmbeddableForeignKeyResultImpl.java:99) at org.hibernate.sql.results.graph.collection.internal.CollectionDomainResult.lambda$createResultAssembler$0(CollectionDomainResult.java:100) at org.hibernate.sql.results.internal.ResultsHelper$1.resolveInitializer(ResultsHelper.java:117) at org.hibernate.sql.results.graph.collection.internal.CollectionDomainResult.createResultAssembler(CollectionDomainResult.java:96) at org.hibernate.sql.results.jdbc.internal.StandardJdbcValuesMapping.resolveAssemblers(StandardJdbcValuesMapping.java:53) at org.hibernate.sql.results.internal.ResultsHelper.createRowReader(ResultsHelper.java:76) at org.hibernate.sql.results.internal.ResultsHelper.createRowReader(ResultsHelper.java:62) at org.hibernate.sql.exec.internal.JdbcSelectExecutorStandardImpl.doExecuteQuery(JdbcSelectExecutorStandardImpl.java:340) at org.hibernate.sql.exec.internal.JdbcSelectExecutorStandardImpl.executeQuery(JdbcSelectExecutorStandardImpl.java:168) at org.hibernate.sql.exec.internal.JdbcSelectExecutorStandardImpl.list(JdbcSelectExecutorStandardImpl.java:93) at org.hibernate.sql.exec.spi.JdbcSelectExecutor.list(JdbcSelectExecutor.java:31) at org.hibernate.loader.ast.internal.CollectionLoaderSingleKey.load(CollectionLoaderSingleKey.java:115) at org.hibernate.loader.ast.internal.AbstractCollectionBatchLoader.load(AbstractCollectionBatchLoader.java:89) at org.hibernate.persister.collection.AbstractCollectionPersister.initialize(AbstractCollectionPersister.java:679) at org.hibernate.event.internal.DefaultInitializeCollectionEventListener.onInitializeCollection(DefaultInitializeCollectionEventListener.java:67) at org.hibernate.event.service.internal.EventListenerGroupImpl.fireEventOnEachListener(EventListenerGroupImpl.java:127) at org.hibernate.internal.SessionImpl.initializeCollection(SessionImpl.java:1703) at org.hibernate.collection.spi.AbstractPersistentCollection.lambda$initialize$3(AbstractPersistentCollection.java:615) at org.hibernate.collection.spi.AbstractPersistentCollection.withTemporarySessionIfNeeded(AbstractPersistentCollection.java:264) at org.hibernate.collection.spi.AbstractPersistentCollection.initialize(AbstractPersistentCollection.java:613) at org.hibernate.collection.spi.AbstractPersistentCollection.read(AbstractPersistentCollection.java:136) at org.hibernate.collection.spi.AbstractPersistentCollection.lambda$readSize$0(AbstractPersistentCollection.java:162) at org.hibernate.collection.spi.AbstractPersistentCollection.withTemporarySessionIfNeeded(AbstractPersistentCollection.java:264) at org.hibernate.collection.spi.AbstractPersistentCollection.readSize(AbstractPersistentCollection.java:148) at org.hibernate.collection.spi.PersistentSet.size(PersistentSet.java:151) at org.hibernate.orm.test.batch.CompositeIdAndElementCollectionBatchingTest.lambda$testSelect$1(CompositeIdAndElementCollectionBatchingTest.java:65) at org.hibernate.testing.orm.transaction.TransactionUtil.wrapInTransaction(TransactionUtil.java:49) at org.hibernate.testing.orm.transaction.TransactionUtil.inTransaction(TransactionUtil.java:24) at org.hibernate.testing.orm.junit.SessionFactoryExtension$SessionFactoryScopeImpl.inTransaction(SessionFactoryExtension.java:375) at org.hibernate.testing.orm.junit.SessionFactoryExtension$SessionFactoryScopeImpl.inTransaction(SessionFactoryExtension.java:352) at org.hibernate.orm.test.batch.CompositeIdAndElementCollectionBatchingTest.testSelect(CompositeIdAndElementCollectionBatchingTest.java:62)

I will submit a reproducer. Most likely the same/similar problem as in (https://hibernate.atlassian.net/browse/HHH-16286 ), but since there was no test case in the original issue, I’m opening this one.

 

Reproducer test:https://github.com/hibernate/hibernate-orm/pull/6713

Activity

Show:
Fixed

Details

Assignee

Reporter

Sprint

Fix versions

Affects versions

Priority

Created June 2, 2023 at 10:26 AM
Updated June 15, 2023 at 9:23 AM
Resolved June 14, 2023 at 8:21 AM