{"record":{"id":"2da6e1c7ff395995","repo":"hibernate/hibernate-orm","slug":"identifier-generator-must-generate-on-insert","errorCode":null,"errorMessage":"Identifier generator must generate on insert","messagePattern":"Identifier generator must generate on insert","errorType":"exception","errorClass":"IdentifierGenerationException","httpStatus":null,"severity":"error","filePath":"hibernate-core/src/main/java/org/hibernate/internal/StatelessSessionImpl.java","lineNumber":417,"sourceCode":"\t\tcatch ( RuntimeException e ) {\n\t\t\tthrow getExceptionConverter().convert( e );\n\t\t}\n\t}\n\n\tprivate Object doInsert(String entityName, Object entity) {\n\t\tcheckNotReadOnly();\n\t\tfinal var persister = getEntityPersister( entityName, entity );\n\t\tfinal Object id;\n\t\tfinal Object[] state = persister.getValues( entity );\n\t\tif ( persister.isVersioned() ) {\n\t\t\tif ( seedVersion( entity, state, persister, this ) ) {\n\t\t\t\tpersister.setValues( entity, state );\n\t\t\t}\n\t\t}\n\t\tfinal var generator = persister.getGenerator();\n\t\tif ( generator.generatedBeforeExecution( entity, this ) ) {\n\t\t\tif ( !generator.generatesOnInsert() ) {\n\t\t\t\tthrow new IdentifierGenerationException( \"Identifier generator must generate on insert\" );\n\t\t\t}\n\t\t\tfinal Object currentValue = generator.allowAssignedIdentifiers() ? persister.getIdentifier( entity ) : null;\n\t\t\tid = ( (BeforeExecutionGenerator) generator ).generate( this, entity, currentValue, INSERT );\n\t\t\tpersister.setIdentifier( entity, id, this );\n\t\t\tif ( firePreInsert(entity, id, state, persister) ) {\n\t\t\t\treturn id;\n\t\t\t}\n\t\t\telse {\n\t\t\t\trunInterceptorCallback(\n\t\t\t\t\t\t() -> getInterceptor().onInsert( entity, id, state, persister.getPropertyNames(), persister.getPropertyTypes() ) );\n\t\t\t\tfinal var eventMonitor = getEventMonitor();\n\t\t\t\tfinal var event = eventMonitor.beginEntityInsertEvent();\n\t\t\t\tboolean success = false;\n\t\t\t\ttry {\n\t\t\t\t\tpersister.getInsertCoordinator().insert( entity, id, state, this );\n\t\t\t\t\tsuccess = true;\n\t\t\t\t}\n\t\t\t\tcatch (ConstraintViolationException cve) {","sourceCodeStart":399,"sourceCodeEnd":435,"githubUrl":"https://github.com/hibernate/hibernate-orm/blob/fad1729dce015f908198d57a8d80274a30f905a5/hibernate-core/src/main/java/org/hibernate/internal/StatelessSessionImpl.java#L399-L435","documentation":"Error \"Identifier generator must generate on insert\" thrown in hibernate/hibernate-orm.","triggerScenarios":"Thrown at hibernate-core/src/main/java/org/hibernate/internal/StatelessSessionImpl.java:417 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":["Assign the identifier manually before calling insert(), or use an id generator that generates on insert (IDENTITY) instead of post-insert generators.","For StatelessSession.insert with non-insert generators, set the id explicitly."],"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"}