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

  1. Reduce the discriminator to exactly one column in the mapping.
  2. Remove duplicate <column>/<meta-column> entries or redundant programmatic addColumn calls.
  3. 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

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


AI-assisted analysis of hibernate/hibernate-orm@fad1729dce (2026-08-22). Data as JSON: /api/errors/9b50296442ca0e12. Report an issue: GitHub.