{"record":{"id":"e03da410fb530af6","repo":"hibernate/hibernate-orm","slug":"discriminator-column-mapping-given-for-non-discrim","errorCode":null,"errorMessage":"Discriminator column mapping given for non-discriminated entity [\" + entityName + \"] as part of resultset mapping [\" + registrationName + \"]","messagePattern":"Discriminator column mapping given for non-discriminated entity \\[\" \\+ entityName \\+ \"\\] as part of resultset mapping \\[\" \\+ registrationName \\+ \"\\]","errorType":"exception","errorClass":"MappingException","httpStatus":null,"severity":"error","filePath":"hibernate-core/src/main/java/org/hibernate/boot/query/HbmResultSetMappingDescriptor.java","lineNumber":392,"sourceCode":"\t\t\t\t\ttableAlias,\n\t\t\t\t\tentityName,\n\t\t\t\t\tregistrationName\n\t\t\t);\n\n\t\t\tfinal var entityDescriptor =\n\t\t\t\t\tresolutionContext.getMappingMetamodel()\n\t\t\t\t\t\t\t.getEntityDescriptor( entityName );\n\t\t\tapplyFetchJoins( joinDescriptorsAccess, tableAlias, propertyFetchDescriptors );\n\n\t\t\tfinal var entityPath = new NavigablePath( entityName );\n\n\t\t\tfinal FetchMementoBasic discriminatorMemento;\n\t\t\tif ( discriminatorColumnAlias == null ) {\n\t\t\t\tdiscriminatorMemento = null;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tif ( entityDescriptor.getDiscriminatorMapping() == null ) {\n\t\t\t\t\tthrow new MappingException(\n\t\t\t\t\t\t\t\"Discriminator column mapping given for non-discriminated entity [\"\n\t\t\t\t\t\t\t\t\t+ entityName + \"] as part of resultset mapping [\" + registrationName + \"]\"\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tdiscriminatorMemento = new FetchMementoBasicStandard(\n\t\t\t\t\t\tentityPath.append( EntityDiscriminatorMapping.DISCRIMINATOR_ROLE_NAME ),\n\t\t\t\t\t\tentityDescriptor.getDiscriminatorMapping(),\n\t\t\t\t\t\tdiscriminatorColumnAlias\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tfinal Map<String, FetchMemento> fetchDescriptorMap = new HashMap<>();\n\t\t\tpropertyFetchDescriptors.forEach(\n\t\t\t\t\thbmFetchDescriptor -> fetchDescriptorMap.put(\n\t\t\t\t\t\t\thbmFetchDescriptor.getFetchablePath(),\n\t\t\t\t\t\t\thbmFetchDescriptor.resolve( resolutionContext )\n\t\t\t\t\t)","sourceCodeStart":374,"sourceCodeEnd":410,"githubUrl":"https://github.com/hibernate/hibernate-orm/blob/fad1729dce015f908198d57a8d80274a30f905a5/hibernate-core/src/main/java/org/hibernate/boot/query/HbmResultSetMappingDescriptor.java#L374-L410","documentation":"An entity <return/> may map a discriminator column alias (classically via <return-property name=\"class\" .../>), which produces a FetchMementoBasic over the discriminator mapping. At resolution time Hibernate fetches the entity descriptor and, when discriminatorColumnAlias is set but entityDescriptor.getDiscriminatorMapping() is null (the entity has no discriminator), throws this MappingException. Only single-table (table-per-class-hierarchy with <discriminator/>) inheritance has a discriminator mapping.","triggerScenarios":"<return-property name=\"class\" column=\"TYPE\"/> inside a <return> whose entity uses joined or union-subclass inheritance, or has no inheritance at all; copying a polymorphic query mapping onto a non-polymorphic entity.","commonSituations":"Inheritance strategy switched from single-table to joined while the native query mapping kept the 'class' return-property; query mappings reused across entities via templates.","solutions":["Remove the <return-property name=\"class\" .../> entry if the entity is not discriminator-polymorphic.","Or switch the entity to single-table inheritance with an explicit <discriminator column=\"...\"/> so the mapping is valid.","Double-check the entity name in the <return/> is the polymorphic root you intended."],"exampleFix":"<!-- before: Order has joined-subclass inheritance, no discriminator -->\n<return alias=\"o\" entity-name=\"com.acme.Order\">\n    <return-property name=\"class\" column=\"ORDER_TYPE\"/>\n</return>\n\n<!-- after: drop the discriminator mapping -->\n<return alias=\"o\" entity-name=\"com.acme.Order\"/>","handlingStrategy":"validation","validationCode":"// before bootstrapping, if a <return-property name=\"class\"> exists, confirm the entity is single-table:\nboolean singleTable = entityElement.element( \"discriminator\" ) != null; // for hbm mappings\nif ( !singleTable && hasClassReturnProperty ) {\n    throw new IllegalStateException( \"Discriminator return-property requires a discriminated entity\" );\n}","typeGuard":null,"tryCatchPattern":"catch ( MappingException e ) {\n    if ( e.getMessage().startsWith( \"Discriminator column mapping given for non-discriminated entity\" ) ) {\n        // remove the 'class' return-property or switch the entity to single-table inheritance\n    }\n}","preventionTips":["Only map a discriminator column alias for single-table inheritance roots.","When changing inheritance strategy, review all native query mappings that touch the hierarchy."],"tags":["hibernate","hbm-xml","native-query","inheritance","discriminator"],"backgroundTag":"discriminator-mapping-mismatch","analyzedSha":"fad1729dce015f908198d57a8d80274a30f905a5","analyzedAt":"2026-08-22T04:13:57.527Z","schemaVersion":2},"datasetVersion":"2026-08-22T09:17:25.309Z"}