Skip to content

Commit 9f03a7e

Browse files
committed
HHH-16991 Fix array based id restriction with EnhanceUserType
1 parent 9df82f7 commit 9f03a7e

File tree

2 files changed

+317
-28
lines changed

2 files changed

+317
-28
lines changed

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

Lines changed: 13 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -109,12 +109,14 @@ public CollectionBatchLoaderArrayParam(
109109
.buildSelectTranslator( getSessionFactory(), sqlSelect )
110110
.translate( JdbcParameterBindings.NO_BINDINGS, QueryOptions.NONE );
111111
}
112+
112113
@Override
113114
public PersistentCollection<?> load(Object keyBeingLoaded, SharedSessionContractImplementor session) {
114115
final ForeignKeyDescriptor keyDescriptor = getLoadable().getKeyDescriptor();
115-
if ( keyDescriptor.isEmbedded() ) {
116+
if ( keyDescriptor.isEmbedded()
117+
|| keyDescriptor.getKeyPart().getSingleJdbcMapping().getValueConverter() != null ) {
116118
assert keyDescriptor.getJdbcTypeCount() == 1;
117-
return loadEmbeddable( keyBeingLoaded, session, keyDescriptor );
119+
return loadWithConversion( keyBeingLoaded, session, keyDescriptor );
118120
}
119121
else {
120122
return super.load( keyBeingLoaded, session );
@@ -123,13 +125,13 @@ public PersistentCollection<?> load(Object keyBeingLoaded, SharedSessionContract
123125
}
124126

125127
@AllowReflection
126-
private PersistentCollection<?> loadEmbeddable(
128+
private PersistentCollection<?> loadWithConversion(
127129
Object keyBeingLoaded,
128130
SharedSessionContractImplementor session,
129131
ForeignKeyDescriptor keyDescriptor) {
130132
if ( MULTI_KEY_LOAD_LOGGER.isTraceEnabled() ) {
131133
MULTI_KEY_LOAD_LOGGER.trace( "Batch fetching collection: "
132-
+ collectionInfoString( getLoadable(), keyBeingLoaded ) );
134+
+ collectionInfoString( getLoadable(), keyBeingLoaded ) );
133135
}
134136

135137
final int length = getDomainBatchSize();
@@ -141,14 +143,14 @@ private PersistentCollection<?> loadEmbeddable(
141143
.getComponentType(),
142144
length
143145
);
144-
final Object[] embeddedKeys = (Object[]) newInstance( keyDomainType, length );
146+
final Object[] domainKeys = (Object[]) newInstance( keyDomainType, length );
145147
session.getPersistenceContextInternal().getBatchFetchQueue()
146148
.collectBatchLoadableCollectionKeys(
147149
length,
148150
(index, key) ->
149151
keyDescriptor.forEachJdbcValue( key, (i, value, jdbcMapping) -> {
150152
keysToInitialize[index] = value;
151-
embeddedKeys[index] = key;
153+
domainKeys[index] = key;
152154
}, session )
153155
,
154156
keyBeingLoaded,
@@ -163,7 +165,7 @@ private PersistentCollection<?> loadEmbeddable(
163165

164166
initializeKeys( keyBeingLoaded, keys, session );
165167

166-
for ( Object initializedKey : embeddedKeys ) {
168+
for ( Object initializedKey : domainKeys ) {
167169
if ( initializedKey != null ) {
168170
finishInitializingKey( initializedKey, session );
169171
}
@@ -186,7 +188,7 @@ void initializeKeys(Object key, Object[] keysToInitialize, SharedSessionContract
186188
assert jdbcSelectOperation != null;
187189
assert jdbcParameter != null;
188190

189-
final JdbcParameterBindings jdbcParameterBindings = new JdbcParameterBindingsImpl(1);
191+
final JdbcParameterBindings jdbcParameterBindings = new JdbcParameterBindingsImpl( 1 );
190192
jdbcParameterBindings.addBinding(
191193
jdbcParameter,
192194
new JdbcParameterBindingImpl( arraySqlTypedMapping.getJdbcMapping(), keysToInitialize )
@@ -219,27 +221,10 @@ void finishInitializingKeys(Object[] keys, SharedSessionContractImplementor sess
219221
}
220222

221223
@Override
222-
@AllowReflection
223224
Object[] resolveKeysToInitialize(Object keyBeingLoaded, SharedSessionContractImplementor session) {
224-
final ForeignKeyDescriptor keyDescriptor = getLoadable().getKeyDescriptor();
225-
if( keyDescriptor.isEmbedded()){
226-
assert keyDescriptor.getJdbcTypeCount() == 1;
227-
final int length = getDomainBatchSize();
228-
final Object[] keysToInitialize = (Object[]) newInstance( keyDescriptor.getSingleJdbcMapping().getJdbcJavaType().getJavaTypeClass(), length );
229-
session.getPersistenceContextInternal().getBatchFetchQueue()
230-
.collectBatchLoadableCollectionKeys(
231-
length,
232-
(index, key) ->
233-
keyDescriptor.forEachJdbcValue( key, (i, value, jdbcMapping) -> {
234-
keysToInitialize[index] = value;
235-
}, session )
236-
,
237-
keyBeingLoaded,
238-
getLoadable()
239-
);
240-
// now trim down the array to the number of keys we found
241-
return trimIdBatch( length, keysToInitialize );
242-
}
225+
assert !getLoadable().getKeyDescriptor().isEmbedded()
226+
&& getLoadable().getKeyDescriptor().getKeyPart().getSingleJdbcMapping().getValueConverter() == null
227+
: "Should use loadWithConversion() instead";
243228
return super.resolveKeysToInitialize( keyBeingLoaded, session );
244229
}
245230
}

0 commit comments

Comments
 (0)