hibernate/hibernate-orm · error · IllegalArgumentException

RemovalsMode.EXCLUDE is incompatible with OrderingMode.ORDER

Error message

RemovalsMode.EXCLUDE is incompatible with OrderingMode.ORDERED

What it means

Error "RemovalsMode.EXCLUDE is incompatible with OrderingMode.ORDERED" thrown in hibernate/hibernate-orm.

Source

Thrown at hibernate-core/src/main/java/org/hibernate/loader/ast/internal/AbstractMultiNaturalIdLoader.java:147

	}

	private Object entityForNaturalId(PersistenceContext context, Object naturalId) {
		final var descriptor = getEntityDescriptor();
		final Object id = context.getNaturalIdResolutions().findCachedIdByNaturalId( naturalId, descriptor );
		// id can be null if a non-existent natural id is requested, or a mutable natural id was changed and then deleted
		return id == null ? null : context.getEntity( new EntityKey( id, descriptor.getEntityPersister() ) );
	}

	private <K> Object[] checkPersistenceContextForCachedResults(
			K[] naturalIds,
			MultiNaturalIdLoadOptions loadOptions,
			SharedSessionContractImplementor session,
			LockOptions lockOptions,
			Consumer<E> results ) {
		final var removalsMode = loadOptions.getRemovalsMode();
		if ( removalsMode == FindMultipleOption.RemovalsMode.EXCLUDE
				&& loadOptions.getOrderingMode() == FindMultipleOption.OrderingMode.ORDERED ) {
			throw new IllegalArgumentException( "RemovalsMode.EXCLUDE is incompatible with OrderingMode.ORDERED" );
		}
		final List<K> unresolvedIds = arrayList( naturalIds.length );
		final var context = session.getPersistenceContextInternal();
		for ( K naturalId : naturalIds ) {
			final Object entity = entityForNaturalId( context, naturalId );
			if ( entity != null ) {
				// Entity is already in the persistence context
				final var entry = context.getEntry( entity );
				if ( removalsMode == FindMultipleOption.RemovalsMode.INCLUDE
						|| !entry.getStatus().isDeletedOrGone() ) {
					// either a managed entry, or a deleted one with returnDeleted enabled
					upgradeLock( entity, entry, lockOptions, session );
					if ( removalsMode != FindMultipleOption.RemovalsMode.EXCLUDE ) {
						final Object result = context.proxyFor( entity );
						results.accept( (E) result );
					}
				}
			}

View on GitHub (pinned to fad1729dce)

Solutions

  1. Do not combine RemovalsMode.EXCLUDE with OrderingMode.ORDERED for natural-id multi loads; adjust the load options.

When it happens

Trigger: Thrown at hibernate-core/src/main/java/org/hibernate/loader/ast/internal/AbstractMultiNaturalIdLoader.java:147 when the library encounters an invalid state.

Common situations: See trigger scenarios.


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