{"record":{"id":"c6120ce22d2bc146","repo":"hibernate/hibernate-orm","slug":"generator-class-classname-must-implement-eith","errorCode":null,"errorMessage":"Generator class '${className}' must implement either 'BeforeExecutionGenerator' or 'OnExecutionGenerator'","messagePattern":"Generator class '(.+?)' must implement either 'BeforeExecutionGenerator' or 'OnExecutionGenerator'","errorType":"exception","errorClass":"MappingException","httpStatus":null,"severity":"error","filePath":"hibernate-core/src/main/java/org/hibernate/boot/model/internal/GeneratorBinder.java","lineNumber":354,"sourceCode":"\t\tif ( BOOT_LOGGER.isTraceEnabled() ) {\n\t\t\tBOOT_LOGGER.addedSequenceGenerator( definitionBuilder.getName() );\n\t\t}\n\t\treturn definitionBuilder.build();\n\t}\n\n\tprivate static IdentifierGeneratorDefinition buildTableIdGenerator(TableGenerator generatorAnnotation) {\n\t\tfinal var definitionBuilder = new IdentifierGeneratorDefinition.Builder();\n\t\tinterpretTableGenerator( generatorAnnotation, definitionBuilder );\n\t\tif ( BOOT_LOGGER.isTraceEnabled() ) {\n\t\t\tBOOT_LOGGER.addedTableGenerator( definitionBuilder.getName() );\n\t\t}\n\t\treturn definitionBuilder.build();\n\t}\n\n\tprivate static void checkGeneratorClass(Class<? extends Generator> generatorClass) {\n\t\tif ( !BeforeExecutionGenerator.class.isAssignableFrom( generatorClass )\n\t\t\t\t&& !OnExecutionGenerator.class.isAssignableFrom( generatorClass ) ) {\n\t\t\tthrow new MappingException( \"Generator class '\" + generatorClass.getName()\n\t\t\t\t\t+ \"' must implement either 'BeforeExecutionGenerator' or 'OnExecutionGenerator'\" );\n\t\t}\n\t}\n\n\tprivate static void checkGeneratorInterfaces(Class<? extends Generator> generatorClass) {\n\t\t// A regular value generator should not implement legacy IdentifierGenerator\n\t\tif ( IdentifierGenerator.class.isAssignableFrom( generatorClass ) ) {\n\t\t\tthrow new AnnotationException( \"Generator class '\" + generatorClass.getName()\n\t\t\t\t\t+ \"' implements 'IdentifierGenerator' and may not be used with '@ValueGenerationType'\" );\n\t\t}\n\t}\n\n\t/**\n\t * Return a {@link GeneratorCreator} for an attribute annotated\n\t * with a {@linkplain ValueGenerationType generator annotation}.\n\t */\n\tprivate static <A extends Annotation> GeneratorCreator generatorCreator(\n\t\t\tMemberDetails memberDetails,","sourceCodeStart":336,"sourceCodeEnd":372,"githubUrl":"https://github.com/hibernate/hibernate-orm/blob/fad1729dce015f908198d57a8d80274a30f905a5/hibernate-core/src/main/java/org/hibernate/boot/model/internal/GeneratorBinder.java#L336-L372","documentation":"Error \"Generator class '${className}' must implement either 'BeforeExecutionGenerator' or 'OnExecutionGenerator'\" thrown in hibernate/hibernate-orm.","triggerScenarios":"An identifier/value generator declaration is inconsistent with the referenced generator or the annotated element.","commonSituations":"@GeneratedValue pointing at a generator of the wrong kind (SEQUENCE vs TABLE), a missing named generator, too many generator annotations, or an unsupported generation strategy for @CollectionId.","solutions":["Make the generator class implement BeforeExecutionGenerator or OnExecutionGenerator."],"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"}