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.
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)
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
- Encountered unexpected content type [%s] for named native qu
- <many-to-any /> mapping [%s] needs to specify 2 or more colu
- <many-to-any /> mapping [%s] needs to specify 2 or more colu
- Expecting just a single formula/column in context of <%s nam
- Expecting single column in context of <%s name="%s"/>, but f
AI-assisted analysis of hibernate/hibernate-orm@fad1729dce (2026-08-22).
Data as JSON: /api/errors/9b50296442ca0e12.
Report an issue: GitHub.