hibernate/hibernate-orm · error · MappingException
ANY discriminator already contained column
Error message
ANY discriminator already contained column
What it means
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.
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.
Example fix
<!-- before: two meta columns on one discriminator -->
<many-to-any name="asset" meta-type="string">
<meta-column name="asset_kind"/>
<meta-column name="asset_kind2"/>
<column name="asset_id"/>
</many-to-any>
<!-- after: exactly one meta column -->
<many-to-any name="asset" meta-type="string">
<meta-column name="asset_kind"/>
<column name="asset_id"/>
</many-to-any> Defensive patterns
Strategy: validation
Try / catch
try {
Metadata metadata = metadataSources.buildMetadata();
}
catch ( MappingException e ) {
// message: ANY discriminator already contained column
// audit every <any>/<many-to-any> discriminator for extra columns
} Prevention
- 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
When it happens
Trigger: 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.
Common situations: Hand-edited hbm.xml after adding a column; stereotype annotations applying the same binding twice; converting many-to-any to any incorrectly.
Related errors
- An association from the table '" + getTable().getName() +…
- <any name=" " /> mapping needs to specify 2 or more columns
- column attribute and formula attribute may not be specified…
- column attribute may not be specified along with <column/>…
- Embeddable class not found
AI-assisted analysis of hibernate/hibernate-orm@fad1729dce (2026-08-22).
Data as JSON: /api/errors/9b50296442ca0e12.
Report an issue: GitHub.
Appendix: source
Thrown at hibernate-core/src/main/java/org/hibernate/mapping/Any.java:348
@Override
public String getTypeName() {
return typeName;
}
@Override
public void setTypeName(String typeName) {
this.typeName = typeName;
}
public String getColumnName() {
return columnName;
}
@Override
public void addColumn(Column column) {
if ( columnName != null ) {
throw new MappingException( "ANY discriminator already contained column" );
}
super.addColumn( column );
this.columnName = columnName( column, getBuildingContext() );
selectableConsumer.accept( column );
column.setValue( this );
}
@Override
public void addColumn(Column column, boolean isInsertable, boolean isUpdatable) {
if ( columnName != null ) {
throw new MappingException( "ANY discriminator already contained column" );
}
super.addColumn( column, isInsertable, isUpdatable );
this.columnName = columnName( column, getBuildingContext() );
selectableConsumer.accept( column );
column.setValue( this );
}
View on GitHub (pinned to fad1729dce)