Hibernate 7 compatibility (Ignite 2.x + records problem)
- Dominant language
- Java
- Stars
- 5.1k
- Forks
- 1.9k
- Avg merge
- 3d 2h
- Merged PRs (30d)
- 46
Description
In Hibernate 7 (at least in 7.3.x+) the query cache internally stores instances of QueryResultsCacheImpl.CacheItem and this class is now a Java record.
Ignite 2 throws an UnsupportedOperationException for records, see the following issue:
https://github.com/apache/ignite/issues/11853
As a result, Ignite 2 is not compatible with Hibernate 7, at least not with the query cache enabled.
**Stacktrace**
...
Caused by: java.lang.UnsupportedOperationException: can't get field offset on a record class: private final long org.hibernate.cache.internal.QueryResultsCacheImpl$CacheItem.timestamp
at jdk.unsupported/sun.misc.Unsafe.objectFieldOffset(Unsafe.java:655)
at org.apache.ignite.internal.util.GridUnsafe.objectFieldOffset(GridUnsafe.java:1216)
at org.apache.ignite.internal.binary.BinariesFactoryImpl.create(BinariesFactoryImpl.java:110)
at org.apache.ignite.internal.binary.BinaryClassDescriptor.(BinaryClassDescriptor.java:366)
at org.apache.ignite.internal.binary.BinaryClassDescriptor.(BinaryClassDescriptor.java:152)
at org.apache.ignite.internal.binary.BinaryContext.createDescriptorForClass(BinaryContext.java:669)
at org.apache.ignite.internal.binary.BinaryContext.descriptorForClass(BinaryContext.java:643)
at org.apache.ignite.internal.binary.BinaryWriterExImpl.marshal0(BinaryWriterExImpl.java:156)
at org.apache.ignite.internal.binary.BinaryWriterExImpl.marshal(BinaryWriterExImpl.java:139)
at org.apache.ignite.internal.binary.BinaryWriterExImpl.marshal(BinaryWriterExImpl.java:126)
at org.apache.ignite.internal.binary.GridBinaryMarshaller.marshal(GridBinaryMarshaller.java:254)
at org.apache.ignite.internal.processors.cache.binary.CacheObjectBinaryProcessorImpl.marshalToBinary(CacheObjectBinaryProcessorImpl.java:487)
at org.apache.ignite.internal.processors.cache.binary.CacheObjectBinaryProcessorImpl.toBinary(CacheObjectBinaryProcessorImpl.java:1383)
at org.apache.ignite.internal.processors.cache.binary.CacheObjectBinaryProcessorImpl.toCacheObject(CacheObjectBinaryProcessorImpl.java:1213)
at org.apache.ignite.internal.processors.cache.GridCacheContext.toCacheObject(GridCacheContext.java:1796)
at org.apache.ignite.internal.processors.cache.distributed.near.GridNearTxLocal.enlistWriteEntry(GridNearTxLocal.java:1386)
at org.apache.ignite.internal.processors.cache.distributed.near.GridNearTxLocal.enlistWrite(GridNearTxLocal.java:925)
at org.apache.ignite.internal.processors.cache.distributed.near.GridNearTxLocal.putAsync0(GridNearTxLocal.java:597)
at org.apache.ignite.internal.processors.cache.distributed.near.GridNearTxLocal.putAsync(GridNearTxLocal.java:446)
at org.apache.ignite.internal.processors.cache.GridCacheAdapter$16.op(GridCacheAdapter.java:1976)
at org.apache.ignite.internal.processors.cache.GridCacheAdapter$16.op(GridCacheAdapter.java:1974)
at org.apache.ignite.internal.processors.cache.GridCacheAdapter.syncOp(GridCacheAdapter.java:3710)
at org.apache.ignite.internal.processors.cache.GridCacheAdapter.put0(GridCacheAdapter.java:1974)
at org.apache.ignite.internal.processors.cache.GridCacheAdapter.put(GridCacheAdapter.java:1952)
at org.apache.ignite.internal.processors.cache.GridCacheAdapter.put(GridCacheAdapter.java:1931)
at org.apache.ignite.internal.processors.cache.IgniteCacheProxyImpl.put(IgniteCacheProxyImpl.java:1290)
at org.apache.ignite.internal.processors.cache.GatewayProtectedCacheProxy.put(GatewayProtectedCacheProxy.java:850)
at org.hibernate.cache.jcache.internal.JCacheAccessImpl.putIntoCache(JCacheAccessImpl.java:41)
at org.hibernate.cache.spi.support.DirectAccessRegionTemplate.putIntoCache(DirectAccessRegionTemplate.java:42)
at org.hibernate.cache.internal.QueryResultsCacheImpl.put(QueryResultsCacheImpl.java:67)
at org.hibernate.sql.results.caching.internal.QueryCachePutManagerEnabledImpl.finishUp(QueryCachePutManagerEnabledImpl.java:60)
at org.hibernate.sql.results.jdbc.internal.JdbcValuesResultSetImpl.finishUp(JdbcValuesResultSetImpl.java:328)
at org.hibernate.sql.results.spi.ListResultsConsumer.consume(ListResultsConsumer.java:174)
at org.hibernate.sql.results.spi.ListResultsConsumer.consume(ListResultsConsumer.java:31)
at org.hibernate.sql.exec.internal.JdbcSelectExecutorStandardImpl.doExecuteQuery(JdbcSelectExecutorStandardImpl.java:213)
at org.hibernate.sql.exec.internal.JdbcSelectExecutorStandardImpl.executeQuery(JdbcSelectExecutorStandardImpl.java:100)
at org.hibernate.sql.exec.spi.JdbcSelectExecutor.executeQuery(JdbcSelectExecutor.java:63)
at org.hibernate.sql.exec.spi.JdbcSelectExecutor.list(JdbcSelectExecutor.java:137)
at org.hibernate.query.sqm.internal.ConcreteSqmSelectQueryPlan.lambda$new$1(ConcreteSqmSelectQueryPlan.java:134)
at org.hibernate.query.sqm.internal.ConcreteSqmSelectQueryPlan.withCacheableSqmInterpretation(ConcreteSqmSelectQueryPlan.java:464)
at org.hibernate.query.sqm.internal.ConcreteSqmSelectQueryPlan.performList(ConcreteSqmSelectQueryPlan.java:392)
at org.hibernate.query.sqm.internal.SqmQueryImpl.doList(SqmQueryImpl.java:374)
at org.hibernate.query.spi.AbstractSelectionQuery.list(AbstractSelectionQuery.java:153)
at org.hibernate.query.Query.getResultList(Query.java:121)
Contributor guide
Research direction
Start with the stack-trace path through GridUnsafe.objectFieldOffset, BinariesFactoryImpl.create, and BinaryClassDescriptor, then review the related Ignite issue 11853. Reproduce the failure with Hibernate 7.3.x, query caching enabled, and the JCache integration. Done means the record-valued cache item no longer triggers the reported UnsupportedOperationException and the compatibility behavior is covered by a regression test.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- java
- Domain
- backend, databases
- Issue type
- Bug
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Activity status
- Quiet
- Clarity
- Needs clarification
- Newbie friendliness
- 45/100