{"record":{"id":"3ef0ea87d64fb12e","repo":"hibernate/hibernate-orm","slug":"force-increment-lock-not-supported-for-version-3ef0ea","errorCode":null,"errorMessage":"Force-increment lock not supported for '@Version' generator","messagePattern":"Force-increment lock not supported for '@Version' generator","errorType":"exception","errorClass":"HibernateException","httpStatus":null,"severity":"error","filePath":"hibernate-core/src/main/java/org/hibernate/persister/entity/AbstractEntityPersister.java","lineNumber":2300,"sourceCode":"\t\t\t// Special case to accommodate the fact that we don't yet\n\t\t\t// allow OnExecutionGenerators with force-increment locking.\n\t\t\t// When possible, falls back to treating the generator as a\n\t\t\t// BeforeExecutionGenerator. In particular, this works for\n\t\t\t// CurrentTimestampGeneration. But it requires an additional\n\t\t\t// request to the database to generate the timestamp. This\n\t\t\t// solution is neither particularly elegant nor efficient.\n\t\t\treturn generator;\n\t\t}\n\t\telse if ( isVersionGeneratedOnExecution() ) {\n\t\t\t// TODO: Ideally, we would allow this case, producing an\n\t\t\t//       UPDATE statement which sets the version column.\n\t\t\t//       Then we could remove the previous special case.\n\t\t\tthrow new HibernateException( \"Force-increment lock not supported for '@Version' property with OnExecutionGenerator\" );\n\t\t}\n\t\telse {\n\t\t\tfinal var generator = getVersionGenerator();\n\t\t\tif ( !generator.generatesOnForceIncrement() ) {\n\t\t\t\tthrow new HibernateException( \"Force-increment lock not supported for '@Version' generator\" );\n\t\t\t}\n\t\t\treturn generator;\n\t\t}\n\t}\n\n\t/**\n\t * Retrieve the version number\n\t */\n\t@Override\n\tpublic Object getCurrentVersion(Object id, SharedSessionContractImplementor session) throws HibernateException {\n\n\t\tif ( CORE_LOGGER.isTraceEnabled() ) {\n\t\t\tCORE_LOGGER.readingEntityVersion( infoString( this, id, getFactory() ) );\n\t\t}\n\t\tfinal String versionSelectString = getVersionSelectString();\n\t\ttry {\n\t\t\tfinal var jdbcCoordinator = session.getJdbcCoordinator();\n\t\t\tfinal var statement = jdbcCoordinator.getStatementPreparer().prepareStatement( versionSelectString );","sourceCodeStart":2282,"sourceCodeEnd":2318,"githubUrl":"https://github.com/hibernate/hibernate-orm/blob/fad1729dce015f908198d57a8d80274a30f905a5/hibernate-core/src/main/java/org/hibernate/persister/entity/AbstractEntityPersister.java#L2282-L2318","documentation":"Error \"Force-increment lock not supported for '@Version' generator\" thrown in hibernate/hibernate-orm.","triggerScenarios":"Thrown when a force-increment optimistic lock is requested on an entity whose @Version value is database-generated.","commonSituations":"See trigger scenarios.","solutions":["Replace the version value generator with a plain @Version mapping to use force-increment locking.","Use PESSIMISTIC locking instead of OPTIMISTIC_FORCE_INCREMENT."],"exampleFix":null,"handlingStrategy":null,"validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"analyzedSha":"fad1729dce015f908198d57a8d80274a30f905a5","analyzedAt":"2026-08-22T04:13:57.527Z","schemaVersion":2},"datasetVersion":"2026-08-22T09:17:25.309Z"}