I recently upgraded my project from Spring boot 2.7 to 3.1. Hibernate and JPA are also upgraded automatically. However, after the update, I am getting this error:
java.lang.UnsupportedOperationException
at org.hibernate.type.descriptor.java.spi.CollectionJavaType.extractHashCode(CollectionJavaType.java:126)
at org.hibernate.type.internal.ConvertedBasicTypeImpl.getHashCode(ConvertedBasicTypeImpl.java:208)
at org.hibernate.type.internal.ConvertedBasicTypeImpl.getHashCode(ConvertedBasicTypeImpl.java:213)
at org.hibernate.type.ComponentType.getHashCode(ComponentType.java:270)
at org.hibernate.engine.spi.EntityKey.generateHashCode(EntityKey.java:60)
at org.hibernate.engine.spi.EntityKey.<init>(EntityKey.java:53)
at org.hibernate.sql.results.graph.entity.AbstractEntityInitializer.resolveEntityKey(AbstractEntityInitializer.java:352)
at org.hibernate.sql.results.graph.entity.AbstractEntityInitializer.resolveKey(AbstractEntityInitializer.java:288)
at org.hibernate.sql.results.internal.InitializersList.resolveKeys(InitializersList.java:82)
at org.hibernate.sql.results.internal.StandardRowReader.coordinateInitializers(StandardRowReader.java:109)
at org.hibernate.sql.results.internal.StandardRowReader.readRow(StandardRowReader.java:87)
at org.hibernate.sql.results.spi.ListResultsConsumer.consume(ListResultsConsumer.java:199)
at org.hibernate.sql.results.spi.ListResultsConsumer.consume(ListResultsConsumer.java:33)
at org.hibernate.sql.exec.internal.JdbcSelectExecutorStandardImpl.doExecuteQuery(JdbcSelectExecutorStandardImpl.java:361)
at org.hibernate.sql.exec.internal.JdbcSelectExecutorStandardImpl.executeQuery(JdbcSelectExecutorStandardImpl.java:168)
at org.hibernate.sql.exec.internal.JdbcSelectExecutorStandardImpl.list(JdbcSelectExecutorStandardImpl.java:93)
at org.hibernate.sql.exec.spi.JdbcSelectExecutor.list(JdbcSelectExecutor.java:31)
at org.hibernate.query.sqm.internal.ConcreteSqmSelectQueryPlan.lambda$new$0(ConcreteSqmSelectQueryPlan.java:110)
at org.hibernate.query.sqm.internal.ConcreteSqmSelectQueryPlan.withCacheableSqmInterpretation(ConcreteSqmSelectQueryPlan.java:303)
at org.hibernate.query.sqm.internal.ConcreteSqmSelectQueryPlan.performList(ConcreteSqmSelectQueryPlan.java:244)
at org.hibernate.query.sqm.internal.QuerySqmImpl.doList(QuerySqmImpl.java:518)
at org.hibernate.query.spi.AbstractSelectionQuery.list(AbstractSelectionQuery.java:367)
at org.hibernate.query.Query.getResultList(Query.java:119)
at org.springframework.data.jpa.repository.support.SimpleJpaRepository.findAll(SimpleJpaRepository.java:382)
at org.springframework.data.jpa.repository.support.SimpleJpaRepository.findAll(SimpleJpaRepository.java:95)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:568)
When I deepdive into the error, I am getting:
(java.lang.string and java.util.list are in module java.base of loader 'bootstrap')
I am getting those errors while executing findAll method:
BenchmarkCategoryRequestDto requestDto = new BenchmarkCategoryRequestDto(APP_ID, DATE);
benchmarkCategoryService.upsertBenchmarkCategory(requestDto);
List<BenchmarkCategory> benchmarkCategories = benchmarkCategoryRepository.findAll();
I am using StringListConverter here:
public class BenchmarkCategory
{
@Id
@Column(name = "category_id")
private Integer categoryId;
@Id
@Column(name = "country")
private String country;
@Id
@Column(name = "date")
private LocalDate date;
@Id
@Convert(converter = StringListConverter.class)
@Column(name = "supply_sources")
private List<String> supplySources;
And here is my StringListConverter:
@Converter
public class StringListConverter implements AttributeConverter<List<String>, String>
{
@Override
public String convertToDatabaseColumn(List<String> list)
{
return CollectionUtils.isEmpty(list) ? null : String.join(",", list);
}
@Override
public List<String> convertToEntityAttribute(String joined)
{
return StringUtils.hasLength(joined) ? new ArrayList<>(Arrays.asList(joined.split(","))) : null;
}
}
I searched on the internet and found that id columns should not have converter. I also tried to remove id from supplySources
however I am still getting the same error. Do you have any idea to solve this error? Thanks in advance.
I tried to remove id and use mutable lists in converter class.