diff --git a/hibernate-core/src/main/java/org/hibernate/boot/jaxb/mapping/spi/db/JaxbTableMapping.java b/hibernate-core/src/main/java/org/hibernate/boot/jaxb/mapping/spi/db/JaxbTableMapping.java index 10d314c05a..9c3771b42b 100644 --- a/hibernate-core/src/main/java/org/hibernate/boot/jaxb/mapping/spi/db/JaxbTableMapping.java +++ b/hibernate-core/src/main/java/org/hibernate/boot/jaxb/mapping/spi/db/JaxbTableMapping.java @@ -6,9 +6,11 @@ */ package org.hibernate.boot.jaxb.mapping.spi.db; +import java.util.List; + +import org.hibernate.boot.jaxb.mapping.spi.JaxbIndexImpl; import org.hibernate.boot.jaxb.mapping.spi.JaxbSchemaAware; -import org.hibernate.boot.jaxb.mapping.spi.db.JaxbCheckable; -import org.hibernate.boot.jaxb.mapping.spi.db.JaxbDatabaseObject; +import org.hibernate.boot.jaxb.mapping.spi.JaxbUniqueConstraintImpl; /** * @author Steve Ebersole @@ -16,4 +18,7 @@ public interface JaxbTableMapping extends JaxbSchemaAware, JaxbCheckable, JaxbDatabaseObject { String getComment(); String getOptions(); + + List getIndexes(); + List getUniqueConstraints(); } diff --git a/hibernate-core/src/main/java/org/hibernate/boot/model/internal/EntityBinder.java b/hibernate-core/src/main/java/org/hibernate/boot/model/internal/EntityBinder.java index d53c1d08eb..14360c0970 100644 --- a/hibernate-core/src/main/java/org/hibernate/boot/model/internal/EntityBinder.java +++ b/hibernate-core/src/main/java/org/hibernate/boot/model/internal/EntityBinder.java @@ -123,6 +123,7 @@ import jakarta.persistence.ForeignKey; import jakarta.persistence.GeneratedValue; import jakarta.persistence.IdClass; +import jakarta.persistence.Index; import jakarta.persistence.Inheritance; import jakarta.persistence.JoinColumn; import jakarta.persistence.JoinTable; @@ -444,8 +445,21 @@ private void processComplementaryTableDefinitions() { TableBinder.addIndexes( appliedTable, usage.getList( "indexes" ), context ); } ); - annotatedClass.forEachAnnotationUsage( jakarta.persistence.Table.class, (usage) -> { - TableBinder.addJpaIndexes( persistentClass.getTable(), usage.getList( "indexes" ), context ); + final AnnotationUsage jpaTableUsage = annotatedClass.getAnnotationUsage( jakarta.persistence.Table.class ); + if ( jpaTableUsage != null ) { + TableBinder.addJpaIndexes( persistentClass.getTable(), jpaTableUsage.getList( "indexes" ), context ); + } + + final InFlightMetadataCollector.EntityTableXref entityTableXref = context + .getMetadataCollector() + .getEntityTableXref( persistentClass.getEntityName() ); + + annotatedClass.forEachAnnotationUsage( jakarta.persistence.SecondaryTable.class, (usage) -> { + final Identifier secondaryTableLogicalName = toIdentifier( usage.getString( "name" ) ); + final Table table = entityTableXref.resolveTable( secondaryTableLogicalName ); + assert table != null; + + TableBinder.addJpaIndexes( table, usage.getList( "indexes" ), context ); } ); } diff --git a/hibernate-core/src/main/java/org/hibernate/boot/model/internal/JPAXMLOverriddenAnnotationReader.java b/hibernate-core/src/main/java/org/hibernate/boot/model/internal/JPAXMLOverriddenAnnotationReader.java index 3de56c637e..840435fed2 100644 --- a/hibernate-core/src/main/java/org/hibernate/boot/model/internal/JPAXMLOverriddenAnnotationReader.java +++ b/hibernate-core/src/main/java/org/hibernate/boot/model/internal/JPAXMLOverriddenAnnotationReader.java @@ -979,8 +979,8 @@ && isEmpty( (String) annotation.valueOf( "catalog" ) ) ) { && isEmpty( (String) annotation.valueOf( "schema" ) ) ) { annotation.setValue( "schema", defaults.getSchema() ); } - buildUniqueConstraints( annotation, subelement.getUniqueConstraint() ); - buildIndex( annotation, subelement.getIndex() ); + buildUniqueConstraints( annotation, subelement.getUniqueConstraints() ); + buildIndex( annotation, subelement.getIndexes() ); annotation.setValue( "joinColumns", getJoinColumns( subelement.getJoinColumn(), false ) ); annotation.setValue( "inverseJoinColumns", getJoinColumns( subelement.getInverseJoinColumn(), true ) ); return AnnotationFactory.create( annotation ); @@ -2772,7 +2772,7 @@ public static TableGenerator buildTableGeneratorAnnotation(JaxbTableGeneratorImp copyAttribute( ad, "pk-column-value", element.getPkColumnValue(), false ); copyAttribute( ad, "initial-value", element.getInitialValue(), false ); copyAttribute( ad, "allocation-size", element.getAllocationSize(), false ); - buildUniqueConstraints( ad, element.getUniqueConstraint() ); + buildUniqueConstraints( ad, element.getUniqueConstraints() ); if ( isEmpty( (String) ad.valueOf( "schema" ) ) && isNotEmpty( defaults.getSchema() ) ) { ad.setValue( "schema", defaults.getSchema() ); @@ -3055,8 +3055,8 @@ && isEmpty( (String) annotation.valueOf( "catalog" ) ) ) { && isEmpty( (String) annotation.valueOf( "schema" ) ) ) { annotation.setValue( "schema", defaults.getSchema() ); } - buildUniqueConstraints( annotation, element.getUniqueConstraint() ); - buildIndex( annotation, element.getIndex() ); + buildUniqueConstraints( annotation, element.getUniqueConstraints() ); + buildIndex( annotation, element.getIndexes() ); return AnnotationFactory.create( annotation ); } } diff --git a/hibernate-core/src/main/java/org/hibernate/boot/models/categorize/internal/GlobalRegistrationsImpl.java b/hibernate-core/src/main/java/org/hibernate/boot/models/categorize/internal/GlobalRegistrationsImpl.java index 0fa8c03a99..07b3e7f5d1 100644 --- a/hibernate-core/src/main/java/org/hibernate/boot/models/categorize/internal/GlobalRegistrationsImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/boot/models/categorize/internal/GlobalRegistrationsImpl.java @@ -723,8 +723,8 @@ public void collectTableGenerators(List tableGenerators) applyStringAttributeIfSpecified( "pkColumnValue", generator.getPkColumnValue(), annotationUsage ); applyAttributeIfSpecified( "initialValue", generator.getInitialValue(), annotationUsage ); applyAttributeIfSpecified( "allocationSize", generator.getAllocationSize(), annotationUsage ); - applyAttributeIfSpecified( "uniqueConstraints", generator.getUniqueConstraint(), annotationUsage ); - applyAttributeIfSpecified( "indexes", generator.getIndex(), annotationUsage ); + applyAttributeIfSpecified( "uniqueConstraints", generator.getUniqueConstraints(), annotationUsage ); + applyAttributeIfSpecified( "indexes", generator.getIndexes(), annotationUsage ); applyStringAttributeIfSpecified( "options", generator.getOptions(), annotationUsage ); collectTableGenerator( new TableGeneratorRegistration( generator.getName(), annotationUsage ) ); diff --git a/hibernate-core/src/main/java/org/hibernate/boot/models/xml/internal/XmlAnnotationHelper.java b/hibernate-core/src/main/java/org/hibernate/boot/models/xml/internal/XmlAnnotationHelper.java index 7e1cc1e1d0..36f933713b 100644 --- a/hibernate-core/src/main/java/org/hibernate/boot/models/xml/internal/XmlAnnotationHelper.java +++ b/hibernate-core/src/main/java/org/hibernate/boot/models/xml/internal/XmlAnnotationHelper.java @@ -88,6 +88,7 @@ import org.hibernate.boot.jaxb.mapping.spi.db.JaxbCheckable; import org.hibernate.boot.jaxb.mapping.spi.db.JaxbColumnJoined; import org.hibernate.boot.jaxb.mapping.spi.db.JaxbTableMapping; +import org.hibernate.boot.models.JpaAnnotations; import org.hibernate.boot.models.categorize.spi.JpaEventListener; import org.hibernate.boot.models.categorize.spi.JpaEventListenerStyle; import org.hibernate.boot.models.internal.AnnotationUsageHelper; @@ -616,15 +617,14 @@ public static void applyIndexes( } final List> indexes = new ArrayList<>( jaxbIndexes.size() ); + final AnnotationDescriptor indexDescriptor = xmlDocumentContext.getModelBuildingContext() + .getAnnotationDescriptorRegistry() + .getDescriptor( Index.class ); jaxbIndexes.forEach( jaxbIndex -> { - final MutableAnnotationUsage indexAnn = XmlProcessingHelper.getOrMakeAnnotation( - Index.class, + final MutableAnnotationUsage indexAnn = indexDescriptor.createUsage( target, - xmlDocumentContext + xmlDocumentContext.getModelBuildingContext() ); - final AnnotationDescriptor indexDescriptor = xmlDocumentContext.getModelBuildingContext() - .getAnnotationDescriptorRegistry() - .getDescriptor( Index.class ); applyOr( jaxbIndex, JaxbIndexImpl::getName, "name", indexAnn, indexDescriptor ); applyOr( jaxbIndex, JaxbIndexImpl::getColumnList, "columnList", indexAnn, indexDescriptor ); applyOr( jaxbIndex, JaxbIndexImpl::isUnique, "unique", indexAnn, indexDescriptor ); @@ -677,10 +677,6 @@ public static MutableAnnotationUsage applyJoinTable( ); } - applyUniqueConstraints( jaxbJoinTable.getUniqueConstraint(), memberDetails, joinTableAnn, xmlDocumentContext ); - - applyIndexes( jaxbJoinTable.getIndex(), memberDetails, joinTableAnn, xmlDocumentContext ); - return joinTableAnn; } @@ -836,8 +832,8 @@ public static void applyTableGenerator( XmlProcessingHelper.applyAttributeIfSpecified( "pkColumnValue", jaxbGenerator.getPkColumnValue(), annotationUsage ); XmlProcessingHelper.applyAttributeIfSpecified( "initialValue", jaxbGenerator.getInitialValue(), annotationUsage ); XmlProcessingHelper.applyAttributeIfSpecified( "allocationSize", jaxbGenerator.getInitialValue(), annotationUsage ); - applyUniqueConstraints( jaxbGenerator.getUniqueConstraint(), memberDetails, annotationUsage, xmlDocumentContext ); - applyIndexes( jaxbGenerator.getIndex(), memberDetails, annotationUsage, xmlDocumentContext ); + applyUniqueConstraints( jaxbGenerator.getUniqueConstraints(), memberDetails, annotationUsage, xmlDocumentContext ); + applyIndexes( jaxbGenerator.getIndexes(), memberDetails, annotationUsage, xmlDocumentContext ); } public static void applyUuidGenerator( @@ -1042,6 +1038,8 @@ public static void applyTableAttributes( applyOr( jaxbTable, JaxbTableMapping::getOptions, "options", tableAnn, annotationDescriptor ); applyOr( jaxbTable, JaxbTableMapping::getComment, "comment", tableAnn, annotationDescriptor ); applyCheckConstraints( jaxbTable, target, tableAnn, xmlDocumentContext ); + applyUniqueConstraints( jaxbTable.getUniqueConstraints(), target, tableAnn, xmlDocumentContext ); + applyIndexes( jaxbTable.getIndexes(), target, tableAnn, xmlDocumentContext ); } public static void applyNaturalId( diff --git a/hibernate-core/src/main/xjb/mapping-bindings.xjb b/hibernate-core/src/main/xjb/mapping-bindings.xjb index 4805227b45..1c71d9d86f 100644 --- a/hibernate-core/src/main/xjb/mapping-bindings.xjb +++ b/hibernate-core/src/main/xjb/mapping-bindings.xjb @@ -412,6 +412,12 @@ org.hibernate.boot.jaxb.mapping.spi.db.JaxbTableMapping + + + + + + @@ -484,6 +490,12 @@ org.hibernate.boot.jaxb.mapping.spi.db.JaxbTableMapping + + + + + + @@ -503,6 +515,12 @@ org.hibernate.boot.jaxb.mapping.spi.db.JaxbTableMapping + + + + + + org.hibernate.boot.jaxb.mapping.spi.JaxbSchemaAware