{"record":{"id":"7b735197873fa569","repo":"hibernate/hibernate-orm","slug":"given-entity-is-not-associated-with-the-persistenc-7b7351","errorCode":null,"errorMessage":"Given entity is not associated with the persistence context","messagePattern":"Given entity is not associated with the persistence context","errorType":"exception","errorClass":"DetachedObjectException","httpStatus":null,"severity":"error","filePath":"hibernate-core/src/main/java/org/hibernate/event/internal/DefaultRefreshEventListener.java","lineNumber":133,"sourceCode":"\t\t}\n\t\telse if ( isTransient ) {\n\t\t\treturn source.getEntityPersister( source.guessEntityName( object ), object );\n\t\t}\n\t\telse {\n\t\t\treturn source.getPersistenceContextInternal().getEntry( object ).getPersister();\n\t\t}\n\t}\n\n\tprivate static void refresh(\n\t\t\t@Nonnull RefreshEvent event,\n\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,","sourceCodeStart":115,"sourceCodeEnd":151,"githubUrl":"https://github.com/hibernate/hibernate-orm/blob/fad1729dce015f908198d57a8d80274a30f905a5/hibernate-core/src/main/java/org/hibernate/event/internal/DefaultRefreshEventListener.java#L115-L151","documentation":"DetachedObjectException thrown from DefaultRefreshEventListener.refresh when persistenceContext.getEntry(object) returns null: the object passed to session.refresh() has no EntityEntry in the current session, meaning it is detached (belongs to a closed/cleared session) or transient (never persisted). refresh() re-reads database state into the managed instance, so it only works for entities attached to this session's persistence context.","triggerScenarios":"session.refresh(detachedEntity) after the originating session was closed or after session.clear()/evict(); refreshing an entity loaded by a different SessionFactory/session instance; refreshing a newly constructed (transient) object; long-lived HTTP-session objects refreshed in a new request's session.","commonSituations":"Entities held past the end of a transaction in web apps (broken Open Session in View or entities stored in HTTP session / DTO caches); multi-request conversations without proper reattachment; unit tests that load entities in one session and refresh in another; Spring @Transactional boundaries between load and refresh.","solutions":["Perform refresh() inside the same session/transaction that loaded the entity","Reattach before refreshing: use session.merge(entity) and refresh the returned managed copy, or session.lock(entity, LockMode.NONE) when the detached state is known-unchanged","Guard with session.contains(entity) — if false, reload via session.find(Entity.class, id) instead of refresh"],"exampleFix":"// before\n// entity loaded in an earlier, closed session\nsession.refresh(order); // DetachedObjectException\n\n// after\nOrder managed = session.merge(order); // reattach (returns managed copy)\nsession.refresh(managed);","handlingStrategy":"validation","validationCode":"if (session.contains(order)) {\n    session.refresh(order);\n}\nelse {\n    order = session.merge(order); // or session.find(Order.class, id)\n    session.refresh(order);\n}","typeGuard":"boolean isManaged(Session s, Object entity) {\n    return s.contains(entity);\n}","tryCatchPattern":"try {\n    session.refresh(order);\n} catch (DetachedObjectException e) {\n    Order managed = (Order) session.merge(order);\n    session.refresh(managed);\n}","preventionTips":["Keep load-and-refresh inside one @Transactional method / one session","After session.clear()/evict(), re-fetch or merge before calling refresh","In web layers, never refresh entities that survived past the request's transaction"],"tags":["hibernate","detached-entity","refresh","persistence-context","orm"],"backgroundTag":"detached-entity-access","analyzedSha":"fad1729dce015f908198d57a8d80274a30f905a5","analyzedAt":"2026-08-22T04:13:57.527Z","schemaVersion":2},"datasetVersion":"2026-08-22T09:17:25.309Z"}