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.
With
hibernate.default_batch_fetch_size
setting set to a value > 1Having 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