diff --git a/hibernate-core/src/main/java/org/hibernate/boot/models/xml/internal/attr/CommonPluralAttributeProcessing.java b/hibernate-core/src/main/java/org/hibernate/boot/models/xml/internal/attr/CommonPluralAttributeProcessing.java index b77deb2305a8..4369e7b19b2a 100644 --- a/hibernate-core/src/main/java/org/hibernate/boot/models/xml/internal/attr/CommonPluralAttributeProcessing.java +++ b/hibernate-core/src/main/java/org/hibernate/boot/models/xml/internal/attr/CommonPluralAttributeProcessing.java @@ -201,8 +201,7 @@ public static void applyPluralAttributeStructure( private static FetchMode interpretFetchMode(JaxbPluralFetchModeImpl fetchMode) { return switch ( fetchMode ) { case JOIN -> FetchMode.JOIN; - case SELECT -> FetchMode.SELECT; - case SUBSELECT -> FetchMode.SELECT; + case SELECT, SUBSELECT -> FetchMode.SELECT; }; } @@ -211,15 +210,16 @@ private static void applyOrderColumn( MutableMemberDetails memberDetails, XmlDocumentContext xmlDocumentContext) { final JaxbOrderColumnImpl jaxbOrderColumn = jaxbPluralAttribute.getOrderColumn(); - if ( jaxbOrderColumn == null ) { - return; - } - - final OrderColumnJpaAnnotation orderColumnAnn = (OrderColumnJpaAnnotation) memberDetails.applyAnnotationUsage( - JpaAnnotations.ORDER_COLUMN, - xmlDocumentContext.getModelBuildingContext() - ); + if ( jaxbOrderColumn != null + || jaxbPluralAttribute.getClassification() == LimitedCollectionClassification.LIST ) { + final OrderColumnJpaAnnotation orderColumnAnn = (OrderColumnJpaAnnotation) memberDetails.applyAnnotationUsage( + JpaAnnotations.ORDER_COLUMN, + xmlDocumentContext.getModelBuildingContext() + ); - orderColumnAnn.apply( jaxbOrderColumn, xmlDocumentContext ); + if ( jaxbOrderColumn != null ) { + orderColumnAnn.apply( jaxbOrderColumn, xmlDocumentContext ); + } + } } } diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/boot/models/hbm/collections/list/ListTests.java b/hibernate-core/src/test/java/org/hibernate/orm/test/boot/models/hbm/collections/list/ListTests.java index 786b28d278af..b65b9b205d21 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/boot/models/hbm/collections/list/ListTests.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/boot/models/hbm/collections/list/ListTests.java @@ -6,6 +6,7 @@ import org.hibernate.mapping.BasicValue; import org.hibernate.mapping.Component; +import org.hibernate.mapping.KeyValue; import org.hibernate.mapping.List; import org.hibernate.mapping.ManyToOne; import org.hibernate.mapping.PersistentClass; @@ -29,6 +30,8 @@ void testXml(DomainModelScope domainModelScope) { final PersistentClass rootBinding = domainModelScope.getDomainModel().getEntityBinding( Root.class.getName() ); validateTags( rootBinding.getProperty( "tags" ) ); validateCategories( rootBinding.getProperty( "categories" ) ); + validateAdmins( rootBinding.getProperty( "admins" ) ); + validateAdmins2( rootBinding.getProperty( "admins2" ) ); } private void validateTags(Property tags) { @@ -58,9 +61,6 @@ private void validateCategories(Property categories) { else if ( "owner".equals( subProperty.getName() ) ) { validateCategoryOwner( subProperty ); } - else if ( "admins".equals( subProperty.getName() ) ) { - validateAdmins( subProperty ); - } else { fail( "Unexpected Category property :" + subProperty.getName() ); } @@ -80,16 +80,41 @@ private void validateCategoryOwner(Property owenerProperty) { } - private void validateAdmins(Property adminsProperty) { - assertThat( adminsProperty.getColumns() ).hasSize( 1 ); - assertThat( adminsProperty.getColumns().get( 0 ).getName() ).isEqualTo( "root_fk" ); + private void validateAdmins(Property property) { + // mapped as many-to-many + assertThat( property.getColumns() ).isEmpty(); - final List listValue = (List) adminsProperty.getValue(); + final List listValue = (List) property.getValue(); assertThat( listValue.getCollectionTable().getName() ).isEqualTo( "root_admins" ); + final KeyValue foreignKey = listValue.getKey(); + assertThat( foreignKey.getColumns() ).hasSize( 1 ); + assertThat( foreignKey.getColumns().get( 0 ).getName() ).isEqualTo( "root_fk" ); + + final BasicValue indexValue = (BasicValue) listValue.getIndex(); + assertThat( indexValue.getColumns() ).hasSize( 1 ); + + final ManyToOne element = (ManyToOne) listValue.getElement(); + assertThat( element.getReferencedEntityName() ).isEqualTo( User.class.getName() ); + } + + private void validateAdmins2(Property property) { + // mapped as one-to-many + assertThat( property.getColumns() ).isEmpty(); + + final List listValue = (List) property.getValue(); + assertThat( listValue.getColumns() ).isEmpty(); + assertThat( listValue.getCollectionTable().getName() ).isEqualTo( "root_admins2" ); + + // key + final KeyValue foreignKey = listValue.getKey(); + assertThat( foreignKey.getColumns() ).hasSize( 1 ); + assertThat( foreignKey.getColumns().get( 0 ).getName() ).isEqualTo( "root_fk" ); + final BasicValue indexValue = (BasicValue) listValue.getIndex(); assertThat( indexValue.getColumns() ).hasSize( 1 ); final ManyToOne element = (ManyToOne) listValue.getElement(); + assertThat( element.getReferencedEntityName() ).isEqualTo( User.class.getName() ); } } diff --git a/hibernate-core/src/test/resources/mappings/models/hbm/list/mapping.xml b/hibernate-core/src/test/resources/mappings/models/hbm/list/mapping.xml index d2145aa86834..b20905ee91fa 100644 --- a/hibernate-core/src/test/resources/mappings/models/hbm/list/mapping.xml +++ b/hibernate-core/src/test/resources/mappings/models/hbm/list/mapping.xml @@ -22,7 +22,6 @@ - @@ -30,7 +29,6 @@ -