Skip to content

Commit 5fd74ad

Browse files
committed
HHH-18493 Resolving already initialized collection elements leads to assertion error
1 parent 6708cd5 commit 5fd74ad

File tree

6 files changed

+341
-37
lines changed

6 files changed

+341
-37
lines changed

hibernate-core/src/main/java/org/hibernate/sql/results/graph/collection/internal/ArrayInitializer.java

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
*/
77
package org.hibernate.sql.results.graph.collection.internal;
88

9+
import java.lang.reflect.Array;
910
import java.util.Iterator;
1011
import java.util.List;
1112
import java.util.function.BiConsumer;
@@ -131,9 +132,11 @@ protected void resolveInstanceSubInitializers(ImmediateCollectionInitializerData
131132
final Initializer<?> initializer = elementAssembler.getInitializer();
132133
if ( initializer != null ) {
133134
final RowProcessingState rowProcessingState = data.getRowProcessingState();
134-
final Iterator iter = getCollectionInstance( data ).elements();
135-
while ( iter.hasNext() ) {
136-
initializer.resolveInstance( iter.next(), rowProcessingState );
135+
final Integer index = listIndexAssembler.assemble( rowProcessingState );
136+
if ( index != null ) {
137+
final PersistentArrayHolder<?> arrayHolder = getCollectionInstance( data );
138+
assert arrayHolder != null;
139+
initializer.resolveInstance( Array.get( arrayHolder.getArray(), index ), rowProcessingState );
137140
}
138141
}
139142
}

hibernate-core/src/main/java/org/hibernate/sql/results/graph/collection/internal/BagInitializer.java

Lines changed: 1 addition & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -123,19 +123,7 @@ protected void initializeSubInstancesFromParent(ImmediateCollectionInitializerDa
123123
protected void resolveInstanceSubInitializers(ImmediateCollectionInitializerData data) {
124124
final Initializer<?> initializer = elementAssembler.getInitializer();
125125
if ( initializer != null ) {
126-
final RowProcessingState rowProcessingState = data.getRowProcessingState();
127-
final PersistentCollection<?> persistentCollection = getCollectionInstance( data );
128-
assert persistentCollection != null;
129-
if ( persistentCollection instanceof PersistentBag<?> ) {
130-
for ( Object element : ( (PersistentBag<?>) persistentCollection ) ) {
131-
initializer.resolveInstance( element, rowProcessingState );
132-
}
133-
}
134-
else {
135-
for ( Object element : ( (PersistentIdentifierBag<?>) persistentCollection ) ) {
136-
initializer.resolveInstance( element, rowProcessingState );
137-
}
138-
}
126+
initializer.resolveKey( data.getRowProcessingState() );
139127
}
140128
}
141129

hibernate-core/src/main/java/org/hibernate/sql/results/graph/collection/internal/ListInitializer.java

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -123,10 +123,11 @@ protected void resolveInstanceSubInitializers(ImmediateCollectionInitializerData
123123
final Initializer<?> initializer = elementAssembler.getInitializer();
124124
if ( initializer != null ) {
125125
final RowProcessingState rowProcessingState = data.getRowProcessingState();
126-
final PersistentList<?> list = getCollectionInstance( data );
127-
assert list != null;
128-
for ( Object element : list ) {
129-
initializer.resolveInstance( element, rowProcessingState );
126+
final Integer index = listIndexAssembler.assemble( rowProcessingState );
127+
if ( index != null ) {
128+
final PersistentList<?> list = getCollectionInstance( data );
129+
assert list != null;
130+
initializer.resolveInstance( list.get( index ), rowProcessingState );
130131
}
131132
}
132133
}

hibernate-core/src/main/java/org/hibernate/sql/results/graph/collection/internal/MapInitializer.java

Lines changed: 21 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -121,17 +121,27 @@ protected void initializeSubInstancesFromParent(ImmediateCollectionInitializerDa
121121
protected void resolveInstanceSubInitializers(ImmediateCollectionInitializerData data) {
122122
final Initializer<?> keyInitializer = mapKeyAssembler.getInitializer();
123123
final Initializer<?> valueInitializer = mapValueAssembler.getInitializer();
124-
if ( keyInitializer != null || valueInitializer != null ) {
125-
final RowProcessingState rowProcessingState = data.getRowProcessingState();
126-
final PersistentMap<?, ?> map = getCollectionInstance( data );
127-
assert map != null;
128-
for ( Map.Entry<?, ?> entry : map.entrySet() ) {
129-
if ( keyInitializer != null ) {
130-
keyInitializer.resolveInstance( entry.getKey(), rowProcessingState );
131-
}
132-
if ( valueInitializer != null ) {
133-
valueInitializer.resolveInstance( entry.getValue(), rowProcessingState );
134-
}
124+
final RowProcessingState rowProcessingState = data.getRowProcessingState();
125+
if ( keyInitializer == null && valueInitializer != null ) {
126+
// For now, we only support resolving the value initializer instance when keys have no initializer,
127+
// though we could also support map keys with an initializer given that the initialized java type:
128+
// * is an entity that uses only the primary key in equals/hashCode.
129+
// If the primary key type is an embeddable, the next condition must hold for that
130+
// * or is an embeddable that has no initializers for fields being used in the equals/hashCode
131+
// which violate this same requirement (recursion)
132+
final Object key = mapKeyAssembler.assemble( rowProcessingState );
133+
if ( key != null ) {
134+
final PersistentMap<?, ?> map = getCollectionInstance( data );
135+
assert map != null;
136+
valueInitializer.resolveInstance( map.get( key ), rowProcessingState );
137+
}
138+
}
139+
else {
140+
if ( keyInitializer != null ) {
141+
keyInitializer.resolveKey( rowProcessingState );
142+
}
143+
if ( valueInitializer != null ) {
144+
valueInitializer.resolveKey( rowProcessingState );
135145
}
136146
}
137147
}

hibernate-core/src/main/java/org/hibernate/sql/results/graph/collection/internal/SetInitializer.java

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -97,12 +97,7 @@ protected void initializeSubInstancesFromParent(ImmediateCollectionInitializerDa
9797
protected void resolveInstanceSubInitializers(ImmediateCollectionInitializerData data) {
9898
final Initializer<?> initializer = elementAssembler.getInitializer();
9999
if ( initializer != null ) {
100-
final RowProcessingState rowProcessingState = data.getRowProcessingState();
101-
final PersistentSet<?> set = getCollectionInstance( data );
102-
assert set != null;
103-
for ( Object element : set ) {
104-
initializer.resolveInstance( element, rowProcessingState );
105-
}
100+
initializer.resolveKey( data.getRowProcessingState() );
106101
}
107102
}
108103

0 commit comments

Comments
 (0)