apache / apache/ignite

Hibernate 7 compatibility (Ignite 2.x + records problem)

Open
#13,286 0 comments 0 reactions 0 assignees View on GitHub
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

Open the contributing 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

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.