hibernate/hibernate-orm · error · HibernateException

Force-increment lock not supported for '@Version' generator

Error message

Force-increment lock not supported for '@Version' generator

What it means

Error "Force-increment lock not supported for '@Version' generator" thrown in hibernate/hibernate-orm.

Source

Thrown at hibernate-core/src/main/java/org/hibernate/persister/entity/AbstractEntityPersister.java:2300

			// Special case to accommodate the fact that we don't yet
			// allow OnExecutionGenerators with force-increment locking.
			// When possible, falls back to treating the generator as a
			// BeforeExecutionGenerator. In particular, this works for
			// CurrentTimestampGeneration. But it requires an additional
			// request to the database to generate the timestamp. This
			// solution is neither particularly elegant nor efficient.
			return generator;
		}
		else if ( isVersionGeneratedOnExecution() ) {
			// TODO: Ideally, we would allow this case, producing an
			//       UPDATE statement which sets the version column.
			//       Then we could remove the previous special case.
			throw new HibernateException( "Force-increment lock not supported for '@Version' property with OnExecutionGenerator" );
		}
		else {
			final var generator = getVersionGenerator();
			if ( !generator.generatesOnForceIncrement() ) {
				throw new HibernateException( "Force-increment lock not supported for '@Version' generator" );
			}
			return generator;
		}
	}

	/**
	 * Retrieve the version number
	 */
	@Override
	public Object getCurrentVersion(Object id, SharedSessionContractImplementor session) throws HibernateException {

		if ( CORE_LOGGER.isTraceEnabled() ) {
			CORE_LOGGER.readingEntityVersion( infoString( this, id, getFactory() ) );
		}
		final String versionSelectString = getVersionSelectString();
		try {
			final var jdbcCoordinator = session.getJdbcCoordinator();
			final var statement = jdbcCoordinator.getStatementPreparer().prepareStatement( versionSelectString );

View on GitHub (pinned to fad1729dce)

Solutions

  1. Replace the version value generator with a plain @Version mapping to use force-increment locking.
  2. Use PESSIMISTIC locking instead of OPTIMISTIC_FORCE_INCREMENT.

When it happens

Trigger: Thrown when a force-increment optimistic lock is requested on an entity whose @Version value is database-generated.

Common situations: See trigger scenarios.


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