[JIRA] (HHH-16991) EnhancedUserType cannot be used when defining relations
by Timon Zilles (JIRA)
Timon Zilles ( https://hibernate.atlassian.net/secure/ViewProfile.jspa?accountId=557058%... ) *created* an issue
Hibernate ORM ( https://hibernate.atlassian.net/browse/HHH?atlOrigin=eyJpIjoiNjEwNWE0Mzhm... ) / Bug ( https://hibernate.atlassian.net/browse/HHH-16991?atlOrigin=eyJpIjoiNjEwNW... ) HHH-16991 ( https://hibernate.atlassian.net/browse/HHH-16991?atlOrigin=eyJpIjoiNjEwNW... ) EnhancedUserType cannot be used when defining relations ( https://hibernate.atlassian.net/browse/HHH-16991?atlOrigin=eyJpIjoiNjEwNW... )
Issue Type: Bug Affects Versions: 6.2.6 Assignee: Unassigned Components: hibernate-core Created: 25/Jul/2023 09:32 AM Priority: Blocker Reporter: Timon Zilles ( https://hibernate.atlassian.net/secure/ViewProfile.jspa?accountId=557058%... )
The JavaDoc for EnhancedUserType says
>
>
>
> A custom type that may function as an identifier or discriminator type
>
>
But when I create an EnhancedUserType for my own types and use them in an entity for the ID column like this
@Entity
public class EntityB {
@Id
@Type(StringWrapperUserType.class)
public StringWrapper id;
// ...
}
and I create a relation to this entity like this
@Entity
public class EntityA {
@Id
@Type(StringWrapperUserType.class)
private StringWrapper id;
@OneToMany(cascade = CascadeType.ALL)
private Set<EntityB> entityBSet;
// ...
}
then I get an exception when I try to access the Set.
*The exception*
java.lang.ArrayStoreException: org.acme.types.StringWrapper
at org.hibernate.type.descriptor.java.ArrayJavaType.unwrap(ArrayJavaType.java:318)
at org.hibernate.type.descriptor.java.ArrayJavaType.unwrap(ArrayJavaType.java:40)
at org.hibernate.type.descriptor.jdbc.ArrayJdbcType$1.getArray(ArrayJdbcType.java:156)
at org.hibernate.type.descriptor.jdbc.ArrayJdbcType$1.doBind(ArrayJdbcType.java:116)
at org.hibernate.type.descriptor.jdbc.BasicBinder.bind(BasicBinder.java:61)
at org.hibernate.sql.exec.internal.AbstractJdbcParameter.bindParameterValue(AbstractJdbcParameter.java:118)
at org.hibernate.sql.exec.internal.AbstractJdbcParameter.bindParameterValue(AbstractJdbcParameter.java:108)
at org.hibernate.sql.results.jdbc.internal.DeferredResultSetAccess.bindParameters(DeferredResultSetAccess.java:199)
at org.hibernate.sql.results.jdbc.internal.DeferredResultSetAccess.executeQuery(DeferredResultSetAccess.java:228)
at org.hibernate.sql.results.jdbc.internal.DeferredResultSetAccess.getResultSet(DeferredResultSetAccess.java:163)
at org.hibernate.sql.results.jdbc.internal.JdbcValuesResultSetImpl.advanceNext(JdbcValuesResultSetImpl.java:254)
at org.hibernate.sql.results.jdbc.internal.JdbcValuesResultSetImpl.processNext(JdbcValuesResultSetImpl.java:134)
at org.hibernate.sql.results.jdbc.internal.AbstractJdbcValues.next(AbstractJdbcValues.java:19)
at org.hibernate.sql.results.internal.RowProcessingStateStandardImpl.next(RowProcessingStateStandardImpl.java:66)
at org.hibernate.sql.results.spi.ListResultsConsumer.consume(ListResultsConsumer.java:178)
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.loader.ast.internal.CollectionBatchLoaderArrayParam.initializeKeys(CollectionBatchLoaderArrayParam.java:193)
at org.hibernate.loader.ast.internal.CollectionBatchLoaderArrayParam.load(CollectionBatchLoaderArrayParam.java:114)
at org.hibernate.persister.collection.AbstractCollectionPersister.initialize(AbstractCollectionPersister.java:680)
at org.hibernate.event.internal.DefaultInitializeCollectionEventListener.onInitializeCollection(DefaultInitializeCollectionEventListener.java:75)
at org.hibernate.event.service.internal.EventListenerGroupImpl.fireEventOnEachListener(EventListenerGroupImpl.java:127)
at org.hibernate.internal.SessionImpl.initializeCollection(SessionImpl.java:1702)
at org.hibernate.collection.spi.AbstractPersistentCollection.lambda$initialize$3(AbstractPersistentCollection.java:617)
at org.hibernate.collection.spi.AbstractPersistentCollection.withTemporarySessionIfNeeded(AbstractPersistentCollection.java:265)
at org.hibernate.collection.spi.AbstractPersistentCollection.initialize(AbstractPersistentCollection.java:615)
at org.hibernate.collection.spi.AbstractPersistentCollection.read(AbstractPersistentCollection.java:136)
at org.hibernate.collection.spi.AbstractPersistentCollection.lambda$readSize$0(AbstractPersistentCollection.java:163)
at org.hibernate.collection.spi.AbstractPersistentCollection.withTemporarySessionIfNeeded(AbstractPersistentCollection.java:265)
at org.hibernate.collection.spi.AbstractPersistentCollection.readSize(AbstractPersistentCollection.java:148)
at org.hibernate.collection.spi.PersistentSet.size(PersistentSet.java:151)
The problem is, that in the unwrap method a String array is created, but the code tries to assign a StringWrapper instance.
See org.hibernate.type.descriptor.java.ArrayJavaType#unwrap
@Override
public <X> X unwrap(T[] value, Class<X> type, WrapperOptions options) {
// [...]
else if ( type.isArray() ) {
final Class<?> preferredJavaTypeClass = type.getComponentType();
// unwrapped == String[16]
final Object[] unwrapped = (Object[]) Array.newInstance( preferredJavaTypeClass, value.length );
for ( int i = 0; i < value.length; i++ ) {
// the right side returns a StringWrapper instance
unwrapped[i] = getElementJavaType().unwrap( value[i], preferredJavaTypeClass, options );
}
//noinspection unchecked
return (X) unwrapped;
}
throw unknownUnwrap( type );
}
I created a reproducer, which is based on Quarkus 3.2.1.Final, which uses hibernate-core in version 6.2.6.Final.
Beside of the application properties there is no Quarkus specific functionality/code inside.
Reproducer: https://github.com/timonzi/hibernate-user-type-for-relation
Simply execute a mvn clean install and the error will occur.
( https://hibernate.atlassian.net/browse/HHH-16991#add-comment?atlOrigin=ey... ) Add Comment ( https://hibernate.atlassian.net/browse/HHH-16991#add-comment?atlOrigin=ey... )
Get Jira notifications on your phone! Download the Jira Cloud app for Android ( https://play.google.com/store/apps/details?id=com.atlassian.android.jira.... ) or iOS ( https://itunes.apple.com/app/apple-store/id1006972087?pt=696495&ct=EmailN... ) This message was sent by Atlassian Jira (v1001.0.0-SNAPSHOT#100233- sha1:f5b6255 )
2 years, 5 months