Skip to content

Commit f2f5c64

Browse files
committed
HHH-18976 Replace unnecessary dynamic array instantiations with calls to new Object[]
The dynamic instantiations were originally introduced to fix the following issues: * HHH-16466 (initial support for array parameters in multi-key loads) -- tested in MultiLoadTest * HHH-16750 -- tested in CompositeIdWithOneFieldAndElementCollectionBatchingTest The corresponding tests still pass after removing these dynamic array instantiations.
1 parent da60144 commit f2f5c64

File tree

5 files changed

+9
-53
lines changed

5 files changed

+9
-53
lines changed

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

Lines changed: 1 addition & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -11,16 +11,10 @@
1111
import org.hibernate.engine.spi.PersistenceContext;
1212
import org.hibernate.engine.spi.SessionFactoryImplementor;
1313
import org.hibernate.engine.spi.SharedSessionContractImplementor;
14-
import org.hibernate.internal.build.AllowReflection;
1514
import org.hibernate.loader.ast.spi.CollectionBatchLoader;
16-
import org.hibernate.metamodel.mapping.NonAggregatedIdentifierMapping;
1715
import org.hibernate.metamodel.mapping.PluralAttributeMapping;
18-
import org.hibernate.metamodel.mapping.ValuedModelPart;
19-
import org.hibernate.metamodel.mapping.internal.IdClassEmbeddable;
2016
import org.hibernate.sql.results.internal.ResultsHelper;
2117

22-
import java.lang.reflect.Array;
23-
2418
import static org.hibernate.loader.ast.internal.MultiKeyLoadHelper.hasSingleId;
2519
import static org.hibernate.loader.ast.internal.MultiKeyLoadHelper.trimIdBatch;
2620
import static org.hibernate.loader.ast.internal.MultiKeyLoadLogging.MULTI_KEY_LOAD_LOGGER;
@@ -127,13 +121,9 @@ protected void finishInitializingKey(Object key, SharedSessionContractImplemento
127121

128122
}
129123

130-
@AllowReflection
131124
Object[] resolveKeysToInitialize(Object keyBeingLoaded, SharedSessionContractImplementor session) {
132125
final int length = getDomainBatchSize();
133-
final Object[] keysToInitialize = (Object[]) Array.newInstance(
134-
getKeyType( getLoadable().getKeyDescriptor().getKeyPart() ),
135-
length
136-
);
126+
final Object[] keysToInitialize = new Object[length];
137127
session.getPersistenceContextInternal().getBatchFetchQueue()
138128
.collectBatchLoadableCollectionKeys(
139129
length,
@@ -145,15 +135,5 @@ Object[] resolveKeysToInitialize(Object keyBeingLoaded, SharedSessionContractImp
145135
return trimIdBatch( length, keysToInitialize );
146136
}
147137

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-
158138

159139
}

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

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@
1111
import org.hibernate.engine.spi.EntityKey;
1212
import org.hibernate.engine.spi.SessionFactoryImplementor;
1313
import org.hibernate.event.spi.EventSource;
14-
import org.hibernate.internal.build.AllowReflection;
1514
import org.hibernate.loader.ast.spi.MultiIdEntityLoader;
1615
import org.hibernate.loader.ast.spi.MultiIdLoadOptions;
1716
import org.hibernate.loader.internal.CacheLoadHelper.PersistenceContextEntry;
@@ -22,7 +21,6 @@
2221
import org.hibernate.sql.exec.spi.JdbcSelectExecutor;
2322
import org.hibernate.type.descriptor.java.JavaType;
2423

25-
import java.lang.reflect.Array;
2624
import java.util.ArrayList;
2725
import java.util.List;
2826

@@ -40,15 +38,12 @@
4038
public abstract class AbstractMultiIdEntityLoader<T> implements MultiIdEntityLoader<T> {
4139
private final EntityMappingType entityDescriptor;
4240
private final SessionFactoryImplementor sessionFactory;
43-
private final EntityIdentifierMapping identifierMapping;
44-
protected final Object[] idArray;
41+
protected final EntityIdentifierMapping identifierMapping;
4542

46-
@AllowReflection
4743
public AbstractMultiIdEntityLoader(EntityMappingType entityDescriptor, SessionFactoryImplementor sessionFactory) {
4844
this.entityDescriptor = entityDescriptor;
4945
this.sessionFactory = sessionFactory;
5046
identifierMapping = getLoadable().getIdentifierMapping();
51-
idArray = (Object[]) Array.newInstance( identifierMapping.getJavaType().getJavaTypeClass(), 0 );
5247
}
5348

5449
protected EntityMappingType getEntityDescriptor() {
@@ -303,7 +298,7 @@ else if ( unresolvedIds.size() == ids.length ) {
303298
}
304299
else {
305300
// we need to load only some the ids
306-
return unresolvedIds.toArray( idArray );
301+
return unresolvedIds.toArray( new Object[0] );
307302
}
308303
}
309304

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

Lines changed: 3 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -4,16 +4,13 @@
44
*/
55
package org.hibernate.loader.ast.internal;
66

7-
import java.lang.reflect.Array;
8-
97
import org.hibernate.LockOptions;
108
import org.hibernate.collection.spi.PersistentCollection;
119
import org.hibernate.engine.spi.CollectionKey;
1210
import org.hibernate.engine.spi.LoadQueryInfluencers;
1311
import org.hibernate.engine.spi.SessionFactoryImplementor;
1412
import org.hibernate.engine.spi.SharedSessionContractImplementor;
1513
import org.hibernate.engine.spi.SubselectFetch;
16-
import org.hibernate.internal.build.AllowReflection;
1714
import org.hibernate.loader.ast.spi.CollectionBatchLoader;
1815
import org.hibernate.loader.ast.spi.SqlArrayMultiKeyLoader;
1916
import org.hibernate.metamodel.mapping.ForeignKeyDescriptor;
@@ -45,7 +42,6 @@
4542
public class CollectionBatchLoaderArrayParam
4643
extends AbstractCollectionBatchLoader
4744
implements SqlArrayMultiKeyLoader {
48-
private final Class<?> keyDomainType;
4945
private final JdbcMapping arrayJdbcMapping;
5046
private final JdbcParameter jdbcParameter;
5147
private final SelectStatement sqlSelect;
@@ -69,7 +65,6 @@ public CollectionBatchLoaderArrayParam(
6965
final ForeignKeyDescriptor keyDescriptor = getLoadable().getKeyDescriptor();
7066
final JdbcMapping jdbcMapping = keyDescriptor.getSingleJdbcMapping();
7167
final Class<?> jdbcJavaTypeClass = jdbcMapping.getJdbcJavaType().getJavaTypeClass();
72-
keyDomainType = getKeyType( keyDescriptor.getKeyPart() );
7368

7469
arrayJdbcMapping = MultiKeyLoadHelper.resolveArrayJdbcMapping(
7570
jdbcMapping,
@@ -110,7 +105,6 @@ public PersistentCollection<?> load(Object keyBeingLoaded, SharedSessionContract
110105

111106
}
112107

113-
@AllowReflection
114108
private PersistentCollection<?> loadEmbeddable(
115109
Object keyBeingLoaded,
116110
SharedSessionContractImplementor session,
@@ -123,15 +117,8 @@ private PersistentCollection<?> loadEmbeddable(
123117
}
124118

125119
final int length = getDomainBatchSize();
126-
final Object[] keysToInitialize = (Object[]) Array.newInstance(
127-
jdbcParameter.getExpressionType()
128-
.getSingleJdbcMapping()
129-
.getJdbcJavaType()
130-
.getJavaTypeClass()
131-
.getComponentType(),
132-
length
133-
);
134-
final Object[] embeddedKeys = (Object[]) Array.newInstance( keyDomainType, length );
120+
final Object[] keysToInitialize = new Object[length];
121+
final Object[] embeddedKeys = new Object[length];
135122
session.getPersistenceContextInternal().getBatchFetchQueue()
136123
.collectBatchLoadableCollectionKeys(
137124
length,
@@ -212,13 +199,12 @@ void finishInitializingKeys(Object[] keys, SharedSessionContractImplementor sess
212199
}
213200

214201
@Override
215-
@AllowReflection
216202
Object[] resolveKeysToInitialize(Object keyBeingLoaded, SharedSessionContractImplementor session) {
217203
final ForeignKeyDescriptor keyDescriptor = getLoadable().getKeyDescriptor();
218204
if( keyDescriptor.isEmbedded()){
219205
assert keyDescriptor.getJdbcTypeCount() == 1;
220206
final int length = getDomainBatchSize();
221-
final Object[] keysToInitialize = (Object[]) Array.newInstance( keyDescriptor.getSingleJdbcMapping().getJdbcJavaType().getJavaTypeClass(), length );
207+
final Object[] keysToInitialize = new Object[length];
222208
session.getPersistenceContextInternal().getBatchFetchQueue()
223209
.collectBatchLoadableCollectionKeys(
224210
length,

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

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,12 @@
44
*/
55
package org.hibernate.loader.ast.internal;
66

7-
import java.lang.reflect.Array;
87
import java.util.Arrays;
98
import java.util.Locale;
109

1110
import org.hibernate.LockOptions;
1211
import org.hibernate.engine.spi.LoadQueryInfluencers;
1312
import org.hibernate.engine.spi.SharedSessionContractImplementor;
14-
import org.hibernate.internal.build.AllowReflection;
1513
import org.hibernate.loader.ast.spi.SqlArrayMultiKeyLoader;
1614
import org.hibernate.metamodel.mapping.BasicEntityIdentifierMapping;
1715
import org.hibernate.metamodel.mapping.EntityIdentifierMapping;
@@ -105,11 +103,9 @@ public int getDomainBatchSize() {
105103
return domainBatchSize;
106104
}
107105

108-
@AllowReflection
109106
protected Object[] resolveIdsToInitialize(Object pkValue, SharedSessionContractImplementor session) {
110107
//TODO: should this really be different to EntityBatchLoaderInPredicate impl?
111-
final Class<?> idType = identifierMapping.getJavaType().getJavaTypeClass();
112-
final Object[] idsToLoad = (Object[]) Array.newInstance( idType, domainBatchSize );
108+
final Object[] idsToLoad = new Object[domainBatchSize];
113109
session.getPersistenceContextInternal().getBatchFetchQueue()
114110
.collectBatchLoadableEntityIds(
115111
domainBatchSize,

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

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -49,10 +49,9 @@ public MultiIdEntityLoaderArrayParam(
4949
EntityMappingType entityDescriptor,
5050
SessionFactoryImplementor sessionFactory) {
5151
super( entityDescriptor, sessionFactory );
52-
final Class<?> idClass = idArray.getClass().getComponentType();
5352
arrayJdbcMapping = resolveArrayJdbcMapping(
5453
getIdentifierMapping().getJdbcMapping(),
55-
idClass,
54+
identifierMapping.getJavaType().getJavaTypeClass(),
5655
getSessionFactory()
5756
);
5857
jdbcParameter = new JdbcParameterImpl( arrayJdbcMapping );
@@ -117,7 +116,7 @@ protected void loadEntitiesById(
117116

118117
final JdbcParameterBindings jdbcParameterBindings = new JdbcParameterBindingsImpl(1);
119118
jdbcParameterBindings.addBinding( jdbcParameter,
120-
new JdbcParameterBindingImpl( arrayJdbcMapping, idsInBatch.toArray( idArray ) ) );
119+
new JdbcParameterBindingImpl( arrayJdbcMapping, idsInBatch ) );
121120

122121
getJdbcSelectExecutor().executeQuery(
123122
getSqlAstTranslatorFactory().buildSelectTranslator( getSessionFactory(), sqlAst )

0 commit comments

Comments
 (0)