hibernate/hibernate-orm · error · PersistentObjectException

Detached entity passed to persist: ${getLoggableName(event.g

Error message

Detached entity passed to persist: ${getLoggableName(event.getEntityName(), entity)}

What it means

Error "Detached entity passed to persist: ${getLoggableName(event.getEntityName(), entity)}" thrown in hibernate/hibernate-orm.

Source

Thrown at hibernate-core/src/main/java/org/hibernate/event/internal/DefaultPersistEventListener.java:83

					throw new PersistentObjectException( "Uninitialized proxy passed to persist()" );
				}
			}
			else {
				persist( event, createCache, lazyInitializer.getImplementation() );
			}
		}
		else {
			persist( event, createCache, object );
		}
	}

	private void persist(@Nonnull PersistEvent event, @Nonnull PersistContext createCache, @Nonnull Object entity) {
		final var source = event.getSession();
		final var entityEntry = source.getPersistenceContextInternal().getEntry( entity );
		final String entityName = entityName( event, entity, entityEntry );
		switch ( getEntityState( entity, entityName, entityEntry, source, true ) ) {
			case DETACHED:
				throw new PersistentObjectException( "Detached entity passed to persist: "
										+ getLoggableName( event.getEntityName(), entity) );
			case PERSISTENT:
				entityIsPersistent( event, createCache );
				break;
			case TRANSIENT:
				entityIsTransient( event, createCache );
				break;
			case DELETED:
				entityEntry.setStatus( Status.MANAGED );
				entityEntry.setDeletedState( null );
				source.getActionQueue().unScheduleDeletion( entityEntry, event.getObject() );
				entityIsDeleted( event, createCache );
				break;
			default:
				throw new ObjectDeletedException( "Deleted entity passed to persist", null,
										getLoggableName( entityName, entity ) );
		}
	}

View on GitHub (pinned to fad1729dce)

Solutions

  1. Use merge() instead of persist() for detached entities.
  2. Set the identifier to null (for generated ids) if you intend to insert a brand-new row.

When it happens

Trigger: Thrown when persist() is called with an entity that already has a persistent identity (detached instance).

Common situations: Typical situations: re-persisting an entity loaded in a previous session; calling persist instead of merge on a detached object; ids assigned manually before persist.


AI-assisted analysis of hibernate/hibernate-orm@fad1729dce (2026-08-22). Data as JSON: /api/errors/a6b45a3edcecbc4e. Report an issue: GitHub.