{"record":{"id":"34c9b4810a35f05e","repo":"hibernate/hibernate-orm","slug":"could-not-format-discriminator-value-to-sql-string-34c9b4","errorCode":null,"errorMessage":"Could not format discriminator value to SQL string","messagePattern":"Could not format discriminator value to SQL string","errorType":"exception","errorClass":"MappingException","httpStatus":null,"severity":"error","filePath":"hibernate-core/src/main/java/org/hibernate/persister/entity/JoinedSubclassEntityPersister.java","lineNumber":201,"sourceCode":"\t\t\t\t\tdiscriminatorAlias = column.getAlias( dialect, persistentClass.getRootTable() );\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tthrow new MappingException( \"Discriminator formulas on joined inheritance hierarchies not supported at this time\" );\n\t\t\t\t}\n\t\t\t\tdiscriminatorType = DiscriminatorHelper.getDiscriminatorType( persistentClass );\n\t\t\t\tdiscriminatorValue = DiscriminatorHelper.getDiscriminatorValue( persistentClass );\n\t\t\t\tdiscriminatorSQLString = DiscriminatorHelper.getDiscriminatorSQLValue( persistentClass, dialect );\n\t\t\t}\n\t\t\telse {\n\t\t\t\texplicitDiscriminatorColumnName = null;\n\t\t\t\tdiscriminatorAlias = IMPLICIT_DISCRIMINATOR_ALIAS;\n\t\t\t\tdiscriminatorType = basicTypeRegistry.resolve( StandardBasicTypes.INTEGER );\n\t\t\t\ttry {\n\t\t\t\t\tdiscriminatorValue = new DiscriminatorValue.Literal( persistentClass.getSubclassId() );\n\t\t\t\t\tdiscriminatorSQLString = Integer.toString( persistentClass.getSubclassId() );\n\t\t\t\t}\n\t\t\t\tcatch ( Exception e ) {\n\t\t\t\t\tthrow new MappingException( \"Could not format discriminator value to SQL string\", e );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\texplicitDiscriminatorColumnName = null;\n\t\t\tdiscriminatorAlias = IMPLICIT_DISCRIMINATOR_ALIAS;\n\t\t\tdiscriminatorType = basicTypeRegistry.resolve( StandardBasicTypes.INTEGER );\n\t\t\tdiscriminatorValue = null;\n\t\t\tdiscriminatorSQLString = null;\n\t\t\tforceDiscriminator = false;\n\t\t}\n\n\t\tif ( optimisticLockStyle().isAllOrDirty() ) {\n\t\t\tthrow new MappingException( \"optimistic-lock=all|dirty not supported for joined-subclass mappings [\" + getEntityName() + \"]\" );\n\t\t}\n\n\t\t//MULTITABLES\n","sourceCodeStart":183,"sourceCodeEnd":219,"githubUrl":"https://github.com/hibernate/hibernate-orm/blob/fad1729dce015f908198d57a8d80274a30f905a5/hibernate-core/src/main/java/org/hibernate/persister/entity/JoinedSubclassEntityPersister.java#L183-L219","documentation":"For a polymorphic JOINED hierarchy without an explicit discriminator mapping, JoinedSubclassEntityPersister synthesizes an implicit integer discriminator from persistentClass.getSubclassId(); the surrounding try/catch converts any failure of that synthesis (DiscriminatorValue.Literal creation or Integer.toString) into MappingException('Could not format discriminator value to SQL string') during boot. Plain annotated/XML mappings should not fail here, so hitting it signals unexpected boot-model state rather than an annotation mistake.","triggerScenarios":"SessionFactory boot of a polymorphic JOINED hierarchy with no explicit discriminator mapping where getSubclassId() or its conversion throws — typically custom PersistentClass metadata, programmatic mapping building, or tampered inheritance configuration.","commonSituations":"Custom metadata sources or programmatic mappings assembling PersistentClass hierarchies; upgrading Hibernate versions where subclass-id assignment changed; partially initialized boot models.","solutions":["Declare an explicit discriminator (@DiscriminatorColumn + @DiscriminatorValue) so the implicit synthesis path is skipped","Remove custom PersistentClass/boot-model customization for the hierarchy and retest with plain annotations","If it reproduces on a plain mapping, minimize it and report to Hibernate (HHH JIRA)"],"exampleFix":"// before: polymorphic JOINED root, implicit discriminator, fails during boot\n@Entity @Inheritance(strategy = InheritanceType.JOINED)\npublic abstract class Party { ... }\n\n// after: explicit discriminator avoids implicit subclass-id synthesis\n@Entity @Inheritance(strategy = InheritanceType.JOINED)\n@DiscriminatorColumn(name = \"party_type\")\npublic abstract class Party { ... }","handlingStrategy":"try-catch","validationCode":null,"typeGuard":null,"tryCatchPattern":"try {\n    SessionFactory sf = metadata.getSessionFactoryBuilder().build();\n}\ncatch ( org.hibernate.MappingException e ) {\n    // implicit joined-inheritance discriminator synthesis failed\n    throw new IllegalStateException(\"SessionFactory boot failed: \" + e.getMessage(), e);\n}","preventionTips":["Prefer an explicit @DiscriminatorColumn on JOINED hierarchies to avoid the implicit subclass-id path","Validate programmatically built PersistentClass hierarchies by booting the factory in tests","Re-run mapping tests after Hibernate version upgrades"],"tags":["hibernate","orm","discriminator","joined-inheritance","boot"],"backgroundTag":"discriminator-value-format-error","analyzedSha":"fad1729dce015f908198d57a8d80274a30f905a5","analyzedAt":"2026-08-22T04:13:57.527Z","schemaVersion":2},"datasetVersion":"2026-08-22T09:17:25.309Z"}