{"record":{"id":"499120addf00271b","repo":"hibernate/hibernate-orm","slug":"could-not-parse-discriminator-value-discriminato","errorCode":null,"errorMessage":"Could not parse discriminator value '{discriminatorValue}' as discriminator type '{discriminatorType}'","messagePattern":"Could not parse discriminator value '(.+?)' as discriminator type '(.+?)'","errorType":"exception","errorClass":"MappingException","httpStatus":null,"severity":"error","filePath":"hibernate-core/src/main/java/org/hibernate/persister/entity/DiscriminatorHelper.java","lineNumber":77,"sourceCode":"\t\t}\n\t\telse if ( persistentClass.isDiscriminatorValueNotNull() ) {\n\t\t\treturn InFragment.NOT_NULL;\n\t\t}\n\t\telse {\n\t\t\treturn discriminatorSqlLiteral( getDiscriminatorType( persistentClass ), persistentClass, dialect );\n\t\t}\n\t}\n\n\tprivate static DiscriminatorValue parseDiscriminatorValue(PersistentClass persistentClass) {\n\t\tfinal BasicType<?> discriminatorType = getDiscriminatorType( persistentClass );\n\t\tfinal String discriminatorValue = persistentClass.getDiscriminatorValue();\n\t\ttry {\n\t\t\treturn new DiscriminatorValue.Literal(\n\t\t\t\t\tdiscriminatorType.getJavaTypeDescriptor().fromString( discriminatorValue )\n\t\t\t);\n\t\t}\n\t\tcatch ( Exception e ) {\n\t\t\tthrow new MappingException( \"Could not parse discriminator value '\" + discriminatorValue\n\t\t\t\t\t\t\t+ \"' as discriminator type '\" + discriminatorType.getName() + \"'\", e );\n\t\t}\n\t}\n\n\tpublic static DiscriminatorValue getDiscriminatorValue(PersistentClass persistentClass) {\n\t\tif ( persistentClass.isDiscriminatorValueNull() ) {\n\t\t\treturn DiscriminatorValue.Special.NULL;\n\t\t}\n\t\telse if ( persistentClass.isDiscriminatorValueNotNull() ) {\n\t\t\treturn DiscriminatorValue.Special.NOT_NULL;\n\t\t}\n\t\telse {\n\t\t\treturn parseDiscriminatorValue( persistentClass );\n\t\t}\n\t}\n\n\tpublic static Object toRelationalValue(DiscriminatorValue discriminatorValue) {\n\t\tif ( discriminatorValue instanceof DiscriminatorValue.Literal literal ) {","sourceCodeStart":59,"sourceCodeEnd":95,"githubUrl":"https://github.com/hibernate/hibernate-orm/blob/fad1729dce015f908198d57a8d80274a30f905a5/hibernate-core/src/main/java/org/hibernate/persister/entity/DiscriminatorHelper.java#L59-L95","documentation":"DiscriminatorHelper.parseDiscriminatorValue takes the entity's discriminator literal (@DiscriminatorValue or XML discriminator-value) as a String and converts it with the discriminator BasicType's JavaTypeDescriptor.fromString(); any failure (e.g., NumberFormatException for 'GUEST' on an Integer discriminator) is wrapped in a MappingException that names both the value and the type. The check runs at SessionFactory boot, so a mismatched literal fails deployment immediately.","triggerScenarios":"@DiscriminatorValue(\"GUEST\") while @DiscriminatorColumn(discriminatorType = INTEGER); @DiscriminatorValue(\"ABC\") on a CHAR discriminator; enum-based discriminators whose literal does not match a constant name.","commonSituations":"DB column is numeric while entities carry textual discriminator values (or vice versa); overriding the discriminator type with @DiscriminatorColumn but keeping old literals; refactoring enum constants without updating @DiscriminatorValue strings.","solutions":["Make the @DiscriminatorValue text parseable by the @DiscriminatorColumn type ('1' for INTEGER, a single character for CHAR)","Or change @DiscriminatorColumn(discriminatorType = ...) to match the literal format you want to use","Omit @DiscriminatorValue to fall back to defaults (entity name for STRING, subclass ids for implicit)"],"exampleFix":"// before\n@Inheritance(SINGLE_TABLE)\n@DiscriminatorColumn(name = \"kind\", discriminatorType = DiscriminatorType.INTEGER)\n@DiscriminatorValue(\"GUEST\")\n\n// after\n@Inheritance(SINGLE_TABLE)\n@DiscriminatorColumn(name = \"kind\", discriminatorType = DiscriminatorType.INTEGER)\n@DiscriminatorValue(\"1\")","handlingStrategy":"validation","validationCode":"DiscriminatorColumn col = entity.getAnnotation(DiscriminatorColumn.class);\nDiscriminatorValue val = entity.getAnnotation(DiscriminatorValue.class);\nif ( val != null && col != null ) {\n    switch ( col.discriminatorType() ) {\n        case INTEGER -> Integer.parseInt(val.value()); // NumberFormatException => invalid mapping\n        case CHAR -> { if ( val.value().length() != 1 ) throw new IllegalArgumentException(\"CHAR literal must be 1 char\"); }\n        default -> { } // STRING always parses\n    }\n}","typeGuard":null,"tryCatchPattern":"try {\n    SessionFactory sf = metadata.getSessionFactoryBuilder().build();\n}\ncatch ( org.hibernate.MappingException e ) {\n    throw new IllegalStateException(\"SessionFactory boot failed: \" + e.getMessage(), e);\n}","preventionTips":["Check every @DiscriminatorValue against the @DiscriminatorColumn type when either changes","Generate a test that boots the full hierarchy; all subclasses' literals are validated at boot","Prefer STRING discriminators unless the schema mandates numeric ones"],"tags":["hibernate","orm","discriminator","inheritance","mapping","annotations"],"backgroundTag":"discriminator-value-parse-error","analyzedSha":"fad1729dce015f908198d57a8d80274a30f905a5","analyzedAt":"2026-08-22T04:13:57.527Z","schemaVersion":2},"datasetVersion":"2026-08-22T09:17:25.309Z"}