Skip to content

Commit a7d440d

Browse files
committed
fix generic typing to in BasicCollectionJavaType
1 parent cd800c2 commit a7d440d

File tree

4 files changed

+129
-101
lines changed

4 files changed

+129
-101
lines changed

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

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,6 @@
99
import org.hibernate.metamodel.mapping.JdbcMapping;
1010
import org.hibernate.type.BasicType;
1111
import org.hibernate.type.descriptor.java.BasicPluralJavaType;
12-
import org.hibernate.type.descriptor.java.JavaType;
13-
import org.hibernate.type.descriptor.java.spi.JavaTypeRegistry;
14-
import org.hibernate.type.spi.TypeConfiguration;
1512

1613
import java.util.Arrays;
1714

@@ -30,18 +27,21 @@ public static JdbcMapping resolveArrayJdbcMapping(
3027
JdbcMapping keyMapping,
3128
Class<?> elementClass,
3229
SessionFactoryImplementor sessionFactory) {
33-
BasicType<?> arrayBasicType = sessionFactory.getTypeConfiguration().getBasicTypeRegistry()
34-
.getRegisteredArrayType( elementClass );
30+
final var arrayBasicType =
31+
sessionFactory.getTypeConfiguration().getBasicTypeRegistry()
32+
.getRegisteredArrayType( elementClass );
3533
if ( arrayBasicType != null ) {
3634
return arrayBasicType;
3735
}
3836

39-
final TypeConfiguration typeConfiguration = sessionFactory.getTypeConfiguration();
40-
final JavaTypeRegistry javaTypeRegistry = typeConfiguration.getJavaTypeRegistry();
37+
final var typeConfiguration = sessionFactory.getTypeConfiguration();
38+
final var javaTypeRegistry = typeConfiguration.getJavaTypeRegistry();
4139

42-
final JavaType<?> rawArrayJavaType = javaTypeRegistry.resolveArrayDescriptor( elementClass );
40+
final var rawArrayJavaType = javaTypeRegistry.resolveArrayDescriptor( elementClass );
4341
if ( !(rawArrayJavaType instanceof BasicPluralJavaType<?> arrayJavaType ) ) {
44-
throw new IllegalArgumentException( "Expecting BasicPluralJavaType for array class `" + elementClass.getTypeName() + "[]`, but got `" + rawArrayJavaType + "`" );
42+
throw new IllegalArgumentException( "Expecting BasicPluralJavaType for array class '"
43+
+ elementClass.getTypeName() + "[]', but got '"
44+
+ rawArrayJavaType + "'" );
4545
}
4646

4747
//noinspection unchecked,rawtypes
@@ -79,6 +79,8 @@ static Object[] trimIdBatch(int length, Object[] keysToInitialize) {
7979
while ( newLength>1 && keysToInitialize[newLength-1] == null ) {
8080
newLength--;
8181
}
82-
return newLength < length ? Arrays.copyOf(keysToInitialize, newLength) : keysToInitialize;
82+
return newLength < length
83+
? Arrays.copyOf(keysToInitialize, newLength)
84+
: keysToInitialize;
8385
}
8486
}

hibernate-core/src/main/java/org/hibernate/type/descriptor/converter/internal/CollectionConverter.java

Lines changed: 25 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -4,61 +4,65 @@
44
*/
55
package org.hibernate.type.descriptor.converter.internal;
66

7-
import java.lang.reflect.Array;
87
import java.util.Collection;
98

109
import org.hibernate.internal.build.AllowReflection;
1110
import org.hibernate.type.descriptor.converter.spi.BasicValueConverter;
1211
import org.hibernate.type.descriptor.java.JavaType;
1312
import org.hibernate.type.descriptor.java.spi.BasicCollectionJavaType;
1413

14+
import static java.lang.reflect.Array.newInstance;
15+
1516
/**
1617
* Handles conversion to/from a collection of a converted element type.
1718
*/
18-
public class CollectionConverter<X extends Collection<Object>, Y> implements BasicValueConverter<X, Y> {
19+
public class CollectionConverter<X extends Collection<E>, E, R> implements BasicValueConverter<X, R[]> {
1920

20-
private final BasicValueConverter<Object, Object> elementConverter;
21+
private final BasicValueConverter<E, R> elementConverter;
2122
private final BasicCollectionJavaType<X, ?> domainJavaType;
22-
private final JavaType<Y> relationalJavaType;
23+
private final JavaType<R[]> relationalJavaType;
2324

2425
public CollectionConverter(
25-
BasicValueConverter<Object, Object> elementConverter,
26-
BasicCollectionJavaType<X, ?> domainJavaType,
27-
JavaType<Y> relationalJavaType) {
26+
BasicValueConverter<E, R> elementConverter,
27+
BasicCollectionJavaType<X, E> domainJavaType,
28+
JavaType<R[]> relationalJavaType) {
2829
this.elementConverter = elementConverter;
2930
this.domainJavaType = domainJavaType;
3031
this.relationalJavaType = relationalJavaType;
3132
}
3233

3334
@Override
34-
public X toDomainValue(Y relationalForm) {
35+
public X toDomainValue(R[] relationalForm) {
3536
if ( relationalForm == null ) {
3637
return null;
3738
}
38-
final Object[] relationalArray = (Object[]) relationalForm;
39-
final X domainForm = domainJavaType.getSemantics().instantiateRaw( relationalArray.length, null );
40-
for ( int i = 0; i < relationalArray.length; i++ ) {
41-
domainForm.add( elementConverter.toDomainValue( relationalArray[i] ) );
39+
final X domainForm =
40+
domainJavaType.getSemantics()
41+
.instantiateRaw( relationalForm.length, null );
42+
for ( R r : relationalForm ) {
43+
domainForm.add( elementConverter.toDomainValue( r ) );
4244
}
4345
return domainForm;
4446
}
4547

4648
@Override
47-
@AllowReflection
48-
public Y toRelationalValue(X domainForm) {
49+
public R[] toRelationalValue(X domainForm) {
4950
if ( domainForm == null ) {
5051
return null;
5152
}
52-
final Object[] relationalArray = (Object[]) Array.newInstance(
53-
elementConverter.getRelationalJavaType().getJavaTypeClass(),
54-
domainForm.size()
55-
);
53+
final R[] relationalArray = newRelationalArray( domainForm.size() );
5654
int i = 0;
57-
for ( Object domainValue : domainForm ) {
55+
for ( var domainValue : domainForm ) {
5856
relationalArray[i++] = elementConverter.toRelationalValue( domainValue );
5957
}
58+
return relationalArray;
59+
}
60+
61+
@AllowReflection
62+
private R[] newRelationalArray(int size) {
63+
final Object result = newInstance( elementConverter.getRelationalJavaType().getJavaTypeClass(), size );
6064
//noinspection unchecked
61-
return (Y) relationalArray;
65+
return (R[]) result;
6266
}
6367

6468
@Override
@@ -67,7 +71,7 @@ public JavaType<X> getDomainJavaType() {
6771
}
6872

6973
@Override
70-
public JavaType<Y> getRelationalJavaType() {
74+
public JavaType<R[]> getRelationalJavaType() {
7175
return relationalJavaType;
7276
}
7377

0 commit comments

Comments
 (0)