{"record":{"id":"f71be43ec0c44fea","repo":"hibernate/hibernate-orm","slug":"naturalidclass-value-must-not-be-void-class","errorCode":null,"errorMessage":"NaturalIdClass#value must not be void.class","messagePattern":"NaturalIdClass#value must not be void\\.class","errorType":"exception","errorClass":"IllegalStateException","httpStatus":null,"severity":"error","filePath":"hibernate-core/src/main/java/org/hibernate/boot/model/internal/EntityBinder.java","lineNumber":1866,"sourceCode":"\t\t}\n\t\t// as a special favor to users, we allow @SQLRestriction to be declared on a @MappedSuperclass\n\t\tClassDetails classToCheck = classDetails.getSuperClass();\n\t\twhile ( classToCheck != null\n\t\t\t\t&& classToCheck.hasAnnotationUsage( MappedSuperclass.class, modelsContext ) ) {\n\t\t\tfinal var fromSuper = getOverridableAnnotation( classToCheck, SQLRestriction.class, context );\n\t\t\tif ( fromSuper != null ) {\n\t\t\t\treturn fromSuper;\n\t\t\t}\n\t\t\tclassToCheck = classToCheck.getSuperClass();\n\t\t}\n\t\treturn null;\n\t}\n\n\tprivate void bindNaturalIdClass() {\n\t\tfinal var ann = annotatedClass.getAnnotationUsage( NaturalIdClass.class, modelsContext() );\n\t\tif ( ann != null ) {\n\t\t\tif ( ann.value() == void.class ) {\n\t\t\t\tthrow new IllegalStateException( \"NaturalIdClass#value must not be void.class\" );\n\t\t\t}\n\t\t\tnaturalIdClass =\n\t\t\t\t\tcontext.getBootstrapContext().getModelsContext()\n\t\t\t\t\t\t\t.getClassDetailsRegistry()\n\t\t\t\t\t\t\t.resolveClassDetails( ann.value().getName() );\n\t\t}\n\t}\n\n\tprivate void bindNaturalIdCache() {\n\t\tfinal var naturalIdCache = annotatedClass.getAnnotationUsage( NaturalIdCache.class, modelsContext() );\n\t\tif ( naturalIdCache != null ) {\n\t\t\tfinal String region = naturalIdCache.region();\n\t\t\tif ( region.isBlank() ) {\n\t\t\t\tfinal var explicitCache = annotatedClass.getAnnotationUsage( Cache.class, modelsContext() );\n\t\t\t\tnaturalIdCacheRegion =\n\t\t\t\t\t\texplicitCache != null && isNotBlank( explicitCache.region() )\n\t\t\t\t\t\t\t\t? explicitCache.region() + NATURAL_ID_CACHE_SUFFIX\n\t\t\t\t\t\t\t\t: annotatedClass.getName() + NATURAL_ID_CACHE_SUFFIX;","sourceCodeStart":1848,"sourceCodeEnd":1884,"githubUrl":"https://github.com/hibernate/hibernate-orm/blob/fad1729dce015f908198d57a8d80274a30f905a5/hibernate-core/src/main/java/org/hibernate/boot/model/internal/EntityBinder.java#L1848-L1884","documentation":"Error \"NaturalIdClass#value must not be void.class\" thrown in hibernate/hibernate-orm.","triggerScenarios":"A @NaturalId mapping is invalid (void NaturalIdClass value or misplaced @NaturalId).","commonSituations":"NaturalIdClass left at its default void.class, or @NaturalId declared on a subclass property.","solutions":["Set NaturalIdClass#value to a concrete class instead of void.class."],"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"}