Skip to content

Commit 3eb324f

Browse files
committed
HHH-17202 Fix ArrayStoreException for single field id class entity collection batch loading
1 parent fc65f98 commit 3eb324f

File tree

2 files changed

+36
-14
lines changed

2 files changed

+36
-14
lines changed

hibernate-core/src/main/java/org/hibernate/loader/ast/internal/AbstractCollectionBatchLoader.java

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,10 @@
1414
import org.hibernate.engine.spi.SessionFactoryImplementor;
1515
import org.hibernate.engine.spi.SharedSessionContractImplementor;
1616
import org.hibernate.loader.ast.spi.CollectionBatchLoader;
17+
import org.hibernate.metamodel.mapping.NonAggregatedIdentifierMapping;
1718
import org.hibernate.metamodel.mapping.PluralAttributeMapping;
19+
import org.hibernate.metamodel.mapping.ValuedModelPart;
20+
import org.hibernate.metamodel.mapping.internal.IdClassEmbeddable;
1821
import org.hibernate.sql.results.internal.ResultsHelper;
1922

2023
import java.lang.reflect.Array;
@@ -127,8 +130,10 @@ protected void finishInitializingKey(Object key, SharedSessionContractImplemento
127130

128131
Object[] resolveKeysToInitialize(Object keyBeingLoaded, SharedSessionContractImplementor session) {
129132
final int length = getDomainBatchSize();
130-
final Class<?> keyType = getLoadable().getKeyDescriptor().getJavaType().getJavaTypeClass();
131-
final Object[] keysToInitialize = (Object[]) Array.newInstance( keyType, length );
133+
final Object[] keysToInitialize = (Object[]) Array.newInstance(
134+
getKeyType( getLoadable().getKeyDescriptor().getKeyPart() ),
135+
length
136+
);
132137
session.getPersistenceContextInternal().getBatchFetchQueue()
133138
.collectBatchLoadableCollectionKeys(
134139
length,
@@ -140,4 +145,15 @@ Object[] resolveKeysToInitialize(Object keyBeingLoaded, SharedSessionContractImp
140145
return trimIdBatch( length, keysToInitialize );
141146
}
142147

148+
protected Class<?> getKeyType(ValuedModelPart keyPart) {
149+
if ( keyPart instanceof NonAggregatedIdentifierMapping ) {
150+
final IdClassEmbeddable idClassEmbeddable = ( (NonAggregatedIdentifierMapping) keyPart ).getIdClassEmbeddable();
151+
if ( idClassEmbeddable != null ) {
152+
return idClassEmbeddable.getMappedJavaType().getJavaTypeClass();
153+
}
154+
}
155+
return keyPart.getJavaType().getJavaTypeClass();
156+
}
157+
158+
143159
}

hibernate-core/src/main/java/org/hibernate/loader/ast/internal/CollectionBatchLoaderArrayParam.java

Lines changed: 18 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,10 @@
1919
import org.hibernate.loader.ast.spi.SqlArrayMultiKeyLoader;
2020
import org.hibernate.metamodel.mapping.ForeignKeyDescriptor;
2121
import org.hibernate.metamodel.mapping.JdbcMapping;
22+
import org.hibernate.metamodel.mapping.NonAggregatedIdentifierMapping;
2223
import org.hibernate.metamodel.mapping.PluralAttributeMapping;
24+
import org.hibernate.metamodel.mapping.ValuedModelPart;
25+
import org.hibernate.metamodel.mapping.internal.IdClassEmbeddable;
2326
import org.hibernate.query.spi.QueryOptions;
2427
import org.hibernate.sql.ast.tree.expression.JdbcParameter;
2528
import org.hibernate.sql.ast.tree.select.SelectStatement;
@@ -45,6 +48,7 @@
4548
public class CollectionBatchLoaderArrayParam
4649
extends AbstractCollectionBatchLoader
4750
implements SqlArrayMultiKeyLoader {
51+
private final Class<?> keyDomainType;
4852
private final JdbcMapping arrayJdbcMapping;
4953
private final JdbcParameter jdbcParameter;
5054
private final SelectStatement sqlSelect;
@@ -66,16 +70,18 @@ public CollectionBatchLoaderArrayParam(
6670
}
6771

6872
final ForeignKeyDescriptor keyDescriptor = getLoadable().getKeyDescriptor();
69-
final Class<?> keyType = keyDescriptor.getJavaType().getJavaTypeClass();
70-
final Class<?> arrayClass = Array.newInstance( keyType, 0 ).getClass();
73+
final JdbcMapping jdbcMapping = keyDescriptor.getSingleJdbcMapping();
74+
final Class<?> jdbcArrayClass = Array.newInstance( jdbcMapping.getJdbcJavaType().getJavaTypeClass(), 0 )
75+
.getClass();
76+
keyDomainType = getKeyType( keyDescriptor.getKeyPart() );
7177

7278
final BasicType<?> arrayBasicType = getSessionFactory().getTypeConfiguration()
7379
.getBasicTypeRegistry()
74-
.getRegisteredType( arrayClass );
80+
.getRegisteredType( jdbcArrayClass );
7581
arrayJdbcMapping = MultiKeyLoadHelper.resolveArrayJdbcMapping(
7682
arrayBasicType,
77-
keyDescriptor.getSingleJdbcMapping(),
78-
arrayClass,
83+
jdbcMapping,
84+
jdbcArrayClass,
7985
getSessionFactory()
8086
);
8187

@@ -95,7 +101,6 @@ public CollectionBatchLoaderArrayParam(
95101
.buildSelectTranslator( getSessionFactory(), sqlSelect )
96102
.translate( JdbcParameterBindings.NO_BINDINGS, QueryOptions.NONE );
97103
}
98-
99104
@Override
100105
public PersistentCollection<?> load(Object keyBeingLoaded, SharedSessionContractImplementor session) {
101106
final ForeignKeyDescriptor keyDescriptor = getLoadable().getKeyDescriptor();
@@ -122,13 +127,14 @@ private PersistentCollection<?> loadEmbeddable(
122127

123128
final int length = getDomainBatchSize();
124129
final Object[] keysToInitialize = (Object[]) Array.newInstance(
125-
keyDescriptor.getSingleJdbcMapping().getJdbcJavaType().getJavaTypeClass(),
126-
length
127-
);
128-
final Object[] embeddedKeys = (Object[]) Array.newInstance(
129-
keyDescriptor.getJavaType().getJavaTypeClass(),
130+
jdbcParameter.getExpressionType()
131+
.getSingleJdbcMapping()
132+
.getJdbcJavaType()
133+
.getJavaTypeClass()
134+
.getComponentType(),
130135
length
131136
);
137+
final Object[] embeddedKeys = (Object[]) Array.newInstance( keyDomainType, length );
132138
session.getPersistenceContextInternal().getBatchFetchQueue()
133139
.collectBatchLoadableCollectionKeys(
134140
length,
@@ -157,7 +163,7 @@ private PersistentCollection<?> loadEmbeddable(
157163
}
158164
final CollectionKey collectionKey = new CollectionKey(
159165
getLoadable().getCollectionDescriptor(),
160-
keysToInitialize
166+
keyBeingLoaded
161167
);
162168
return session.getPersistenceContext().getCollection( collectionKey );
163169
}

0 commit comments

Comments
 (0)