{"record":{"id":"9b50296442ca0e12","repo":"hibernate/hibernate-orm","slug":"any-discriminator-already-contained-column","errorCode":null,"errorMessage":"ANY discriminator already contained column","messagePattern":"ANY discriminator already contained column","errorType":"exception","errorClass":"MappingException","httpStatus":null,"severity":"error","filePath":"hibernate-core/src/main/java/org/hibernate/mapping/Any.java","lineNumber":348,"sourceCode":"\n\t\t@Override\n\t\tpublic String getTypeName() {\n\t\t\treturn typeName;\n\t\t}\n\n\t\t@Override\n\t\tpublic void setTypeName(String typeName) {\n\t\t\tthis.typeName = typeName;\n\t\t}\n\n\t\tpublic String getColumnName() {\n\t\t\treturn columnName;\n\t\t}\n\n\t\t@Override\n\t\tpublic void addColumn(Column column) {\n\t\t\tif ( columnName != null ) {\n\t\t\t\tthrow new MappingException( \"ANY discriminator already contained column\" );\n\t\t\t}\n\t\t\tsuper.addColumn( column );\n\t\t\tthis.columnName = columnName( column, getBuildingContext() );\n\t\t\tselectableConsumer.accept( column );\n\t\t\tcolumn.setValue( this );\n\t\t}\n\n\t\t@Override\n\t\tpublic void addColumn(Column column, boolean isInsertable, boolean isUpdatable) {\n\t\t\tif ( columnName != null ) {\n\t\t\t\tthrow new MappingException( \"ANY discriminator already contained column\" );\n\t\t\t}\n\t\t\tsuper.addColumn( column, isInsertable, isUpdatable );\n\t\t\tthis.columnName = columnName( column, getBuildingContext() );\n\t\t\tselectableConsumer.accept( column );\n\t\t\tcolumn.setValue( this );\n\t\t}\n","sourceCodeStart":330,"sourceCodeEnd":366,"githubUrl":"https://github.com/hibernate/hibernate-orm/blob/fad1729dce015f908198d57a8d80274a30f905a5/hibernate-core/src/main/java/org/hibernate/mapping/Any.java#L330-L366","documentation":"The discriminator of an org.hibernate.mapping.Any value may bind exactly one column. The first addColumn records the column name; any second addColumn on the discriminator throws MappingException because a discriminator maps to a single-column span.","triggerScenarios":"hbm.xml any/many-to-any mapping that lists two <column> (or <meta-column>) elements for the discriminator; programmatic bootstrap calling addColumn twice on the Any discriminator value; mapping processors or composed annotations that bind the meta column twice.","commonSituations":"Hand-edited hbm.xml after adding a column; stereotype annotations applying the same binding twice; converting many-to-any to any incorrectly.","solutions":["Reduce the discriminator to exactly one column in the mapping.","Remove duplicate <column>/<meta-column> entries or redundant programmatic addColumn calls.","Model genuinely multi-column discriminators differently (e.g., separate associations); @Any does not support them."],"exampleFix":"<!-- before: two meta columns on one discriminator -->\n<many-to-any name=\"asset\" meta-type=\"string\">\n    <meta-column name=\"asset_kind\"/>\n    <meta-column name=\"asset_kind2\"/>\n    <column name=\"asset_id\"/>\n</many-to-any>\n\n<!-- after: exactly one meta column -->\n<many-to-any name=\"asset\" meta-type=\"string\">\n    <meta-column name=\"asset_kind\"/>\n    <column name=\"asset_id\"/>\n</many-to-any>","handlingStrategy":"validation","validationCode":null,"typeGuard":null,"tryCatchPattern":"try {\n    Metadata metadata = metadataSources.buildMetadata();\n}\ncatch ( MappingException e ) {\n    // message: ANY discriminator already contained column\n    // audit every <any>/<many-to-any> discriminator for extra columns\n}","preventionTips":["Prefer annotations (@Any with @AnyMetaDef) over hand-written hbm for polymorphic associations","Validate mapping files against the schema so stray meta-column elements surface early","Add a bootstrap smoke test that builds the full metadata before deployment"],"tags":["hibernate","any-mapping","hbm","mapping"],"backgroundTag":"invalid-orm-mapping","analyzedSha":"fad1729dce015f908198d57a8d80274a30f905a5","analyzedAt":"2026-08-22T04:13:57.527Z","schemaVersion":2},"datasetVersion":"2026-08-22T09:17:25.309Z"}