While upgrading from Hibernate ORM 5.3.28.Final to 6.2.1.Final (due to an application server update from Wildfly 26.1.3 to Wildfly 28.0.1) we encountered following error when fetching data from our database / 2nd Level Cache:
{code:none}Caused by: org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing: tld.domain.Model at org.hibernate@6.2.1.Final//org.hibernate.engine.internal.ForeignKeys.getEntityIdentifierIfNotUnsaved(ForeignKeys.java:346) at org.hibernate@6.2.1.Final//org.hibernate.type.ManyToOneType.disassemble(ManyToOneType.java:171) at org.hibernate@6.2.1.Final//org.hibernate.cache.spi.entry.CacheEntryHelper.disassemble(CacheEntryHelper.java:48) at org.hibernate@6.2.1.Final//org.hibernate.cache.spi.entry.StandardCacheEntryImpl.<init>(StandardCacheEntryImpl.java:50) at org.hibernate@6.2.1.Final//org.hibernate.persister.entity.AbstractEntityPersister$StandardCacheEntryHelper.buildCacheEntry(AbstractEntityPersister.java:4456) at org.hibernate@6.2.1.Final//org.hibernate.persister.entity.AbstractEntityPersister.buildCacheEntry(AbstractEntityPersister.java:3604) at org.hibernate@6.2.1.Final//org.hibernate.sql.results.graph.entity.AbstractEntityInitializer.putInCache(AbstractEntityInitializer.java:939) at org.hibernate@6.2.1.Final//org.hibernate.sql.results.graph.entity.AbstractEntityInitializer.updateCaches(AbstractEntityInitializer.java:873) at org.hibernate@6.2.1.Final//org.hibernate.sql.results.graph.entity.AbstractEntityInitializer.finishUpRow(AbstractEntityInitializer.java:1140) at org.hibernate@6.2.1.Final//org.hibernate.sql.results.internal.InitializersList.finishUpRow(InitializersList.java:64) at org.hibernate@6.2.1.Final//org.hibernate.sql.results.internal.StandardRowReader.afterRow(StandardRowReader.java:104) at org.hibernate@6.2.1.Final//org.hibernate.sql.results.internal.StandardRowReader.readRow(StandardRowReader.java:97) at org.hibernate@6.2.1.Final//org.hibernate.sql.results.spi.ListResultsConsumer.consume(ListResultsConsumer.java:179) at org.hibernate@6.2.1.Final//org.hibernate.sql.results.spi.ListResultsConsumer.consume(ListResultsConsumer.java:33) at org.hibernate@6.2.1.Final//org.hibernate.sql.exec.internal.JdbcSelectExecutorStandardImpl.doExecuteQuery(JdbcSelectExecutorStandardImpl.java:362) at org.hibernate@6.2.1.Final//org.hibernate.sql.exec.internal.JdbcSelectExecutorStandardImpl.executeQuery(JdbcSelectExecutorStandardImpl.java:168) at org.hibernate@6.2.1.Final//org.hibernate.sql.exec.internal.JdbcSelectExecutorStandardImpl.list(JdbcSelectExecutorStandardImpl.java:93) at org.hibernate@6.2.1.Final//org.hibernate.sql.exec.spi.JdbcSelectExecutor.list(JdbcSelectExecutor.java:31) at org.hibernate@6.2.1.Final//org.hibernate.loader.ast.internal.SingleUniqueKeyEntityLoaderStandard.load(SingleUniqueKeyEntityLoaderStandard.java:98) at org.hibernate@6.2.1.Final//org.hibernate.persister.entity.AbstractEntityPersister.loadByUniqueKey(AbstractEntityPersister.java:2460) at org.hibernate@6.2.1.Final//org.hibernate.persister.entity.AbstractEntityPersister.loadByUniqueKey(AbstractEntityPersister.java:2452) at org.hibernate@6.2.1.Final//org.hibernate.sql.results.graph.entity.internal.EntitySelectFetchByUniqueKeyInitializer.initializeInstance(EntitySelectFetchByUniqueKeyInitializer.java:85) at org.hibernate@6.2.1.Final//org.hibernate.sql.results.internal.InitializersList.initializeInstance(InitializersList.java:70) at org.hibernate@6.2.1.Final//org.hibernate.sql.results.internal.StandardRowReader.coordinateInitializers(StandardRowReader.java:111) at org.hibernate@6.2.1.Final//org.hibernate.sql.results.internal.StandardRowReader.readRow(StandardRowReader.java:87) at org.hibernate@6.2.1.Final//org.hibernate.sql.results.spi.ListResultsConsumer.consume(ListResultsConsumer.java:199) at org.hibernate@6.2.1.Final//org.hibernate.sql.results.spi.ListResultsConsumer.consume(ListResultsConsumer.java:33) at org.hibernate@6.2.1.Final//org.hibernate.sql.exec.internal.JdbcSelectExecutorStandardImpl.doExecuteQuery(JdbcSelectExecutorStandardImpl.java:362) at org.hibernate@6.2.1.Final//org.hibernate.sql.exec.internal.JdbcSelectExecutorStandardImpl.executeQuery(JdbcSelectExecutorStandardImpl.java:168) at org.hibernate@6.2.1.Final//org.hibernate.sql.exec.internal.JdbcSelectExecutorStandardImpl.list(JdbcSelectExecutorStandardImpl.java:93) at org.hibernate@6.2.1.Final//org.hibernate.sql.exec.spi.JdbcSelectExecutor.list(JdbcSelectExecutor.java:31) at org.hibernate@6.2.1.Final//org.hibernate.query.sqm.internal.ConcreteSqmSelectQueryPlan.lambda$new$0(ConcreteSqmSelectQueryPlan.java:109) at org.hibernate@6.2.1.Final//org.hibernate.query.sqm.internal.ConcreteSqmSelectQueryPlan.withCacheableSqmInterpretation(ConcreteSqmSelectQueryPlan.java:302) at org.hibernate@6.2.1.Final//org.hibernate.query.sqm.internal.ConcreteSqmSelectQueryPlan.performList(ConcreteSqmSelectQueryPlan.java:243) at org.hibernate@6.2.1.Final//org.hibernate.query.sqm.internal.QuerySqmImpl.doList(QuerySqmImpl.java:521) at org.hibernate@6.2.1.Final//org.hibernate.query.spi.AbstractSelectionQuery.list(AbstractSelectionQuery.java:367{code}
After digging deeper we found out that the following that the combination:
* Second Level Caching enabled * Optimistic locking using the @Version annotation * @OneToOne{FetchType.LAZY) on a one-to-one bidrectional (on the property of the referenced entity)
is causing this TransientObjectException while trying to fetch data.
This issue seems to be close to [https://hibernate.atlassian.net/browse/HHH-16126|https://hibernate.atlassian.net/browse/HHH-16126|smart-link] .
We validated that the issue still exists in: 6.2.4, 6.2.3 and 6.2.2.
A Pull-Request for reproducing the error will be attached shortly. |
|