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:
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
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 . 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. |