{"record":{"id":"2d2c10abe131f8ca","repo":"hibernate/hibernate-orm","slug":"no-row-with-the-given-identifier-exists","errorCode":null,"errorMessage":"No row with the given identifier exists","messagePattern":"No row with the given identifier exists","errorType":"exception","errorClass":"UnresolvableObjectException","httpStatus":null,"severity":"error","filePath":"hibernate-core/src/main/java/org/hibernate/event/internal/DefaultRefreshEventListener.java","lineNumber":144,"sourceCode":"\t\t\t@Nonnull RefreshContext refreshedAlready,\n\t\t\t@Nonnull Object object) {\n\t\tfinal var source = event.getSession();\n\t\tfinal var persistenceContext = source.getPersistenceContextInternal();\n\t\tfinal var entry = persistenceContext.getEntry( object );\n\n\t\tif ( entry == null ) {\n\t\t\tthrow new DetachedObjectException( \"Given entity is not associated with the persistence context\" );\n\t\t}\n\n\t\tfinal var persister = entry.getPersister();\n\t\tfinal Object id = entry.getId();\n\n\t\tif ( EVENT_LISTENER_LOGGER.isTraceEnabled() ) {\n\t\t\tEVENT_LISTENER_LOGGER.refreshing(\n\t\t\t\t\tinfoString( persister, id, event.getFactory() ) );\n\t\t}\n\t\tif ( !entry.isExistsInDatabase() ) {\n\t\t\tthrow new UnresolvableObjectException( id, persister.getEntityName() );\n\t\t}\n\n\t\t// cascade the refresh prior to refreshing this entity\n\t\tCascade.cascade(\n\t\t\t\tCascadingActions.REFRESH,\n\t\t\t\tCascadePoint.BEFORE_REFRESH,\n\t\t\t\tsource,\n\t\t\t\tpersister,\n\t\t\t\tobject,\n\t\t\t\trefreshedAlready\n\t\t);\n\n\t\tpersistenceContext.removeEntityHolder( entry.getEntityKey() );\n\t\tif ( persister.hasCollections() ) {\n\t\t\tnew EvictVisitor( source, object ).process( object, persister );\n\t\t}\n\t\tpersistenceContext.removeEntry( object );\n","sourceCodeStart":126,"sourceCodeEnd":162,"githubUrl":"https://github.com/hibernate/hibernate-orm/blob/fad1729dce015f908198d57a8d80274a30f905a5/hibernate-core/src/main/java/org/hibernate/event/internal/DefaultRefreshEventListener.java#L126-L162","documentation":"UnresolvableObjectException (message 'No row with the given identifier exists') raised in DefaultRefreshEventListener.refresh when the entity's EntityEntry reports isExistsInDatabase() == false. The session has already concluded the backing row is gone — typically because a delete is pending/persisted in this session or the row vanished between load and refresh. The exception carries the identifier and entity name of the unreachable row.","triggerScenarios":"session.refresh() (including cascade REFRESH from a parent) on an entity that was removed via session.remove()/delete() in the same unit of work before flush; refreshing an entity whose row was deleted by a concurrent transaction or a direct JDBC/DBA operation after it was loaded.","commonSituations":"Concurrent deletion by another user, batch job, or cleanup thread while a stale managed entity is still being refreshed; deleting and refreshing the same object in one service method; cascade=REFRESH reaching children already scheduled for cascade delete; test fixtures deleted mid-test while entities remain managed.","solutions":["Do not refresh entities scheduled for deletion — reload instead: session.find(Entity.class, id) and treat a null result as deleted","For concurrent deletes, catch UnresolvableObjectException (or pre-check existence with a fresh find/count query) and discard the stale reference gracefully","Review cascade rules (CascadeType.REFRESH combined with REMOVE) so a cascade-refresh cannot reach entities pending delete"],"exampleFix":"// before\nmanager.remove(order);\nsession.refresh(order); // UnresolvableObjectException: row already gone\n\n// after\nmanager.remove(order);\n// never refresh a removed entity; reload if still needed:\nOrder fresh = session.find(Order.class, order.getId()); // null => deleted","handlingStrategy":"try-catch","validationCode":"if (session.find(Order.class, order.getId()) != null) {\n    session.refresh(order);\n} // null means the row is gone — skip refresh","typeGuard":"null","tryCatchPattern":"try {\n    session.refresh(order);\n} catch (UnresolvableObjectException e) {\n    // row deleted concurrently or pending delete: drop the stale reference\n    log.info(\"Order {} no longer exists\", e.getIdentifier());\n    session.detach(order);\n}","preventionTips":["Never refresh an entity you removed in the same unit of work","Avoid CascadeType.REFRESH on associations that also cascade REMOVE","For concurrent-delete hotspots, re-check existence with find() instead of refresh"],"tags":["hibernate","refresh","deleted-row","concurrency","orm"],"backgroundTag":"row-deleted-concurrently","analyzedSha":"fad1729dce015f908198d57a8d80274a30f905a5","analyzedAt":"2026-08-22T04:13:57.527Z","schemaVersion":2},"datasetVersion":"2026-08-22T09:17:25.309Z"}