From 905e86a04de27d16f6002fee00892bc072e8fa46 Mon Sep 17 00:00:00 2001 From: Andrea Boriero Date: Tue, 7 May 2024 17:54:14 +0200 Subject: [PATCH] HHH-18081 XML element is not added to JdkClassDetails --- .../xml/internal/ManagedTypeProcessor.java | 1 + .../xml/internal/XmlAnnotationHelper.java | 45 +++++++++++++++++-- .../xml/internal/db/ForeignKeyProcessing.java | 36 +++++++++++++++ .../xml/internal/db/JoinColumnProcessing.java | 40 +++++++++++++++++ .../src/main/xjb/mapping-bindings.xjb | 10 +++++ .../secondarytable/SecondaryTableTest.java | 21 ++++++++- 6 files changed, 148 insertions(+), 5 deletions(-) diff --git a/hibernate-core/src/main/java/org/hibernate/boot/models/xml/internal/ManagedTypeProcessor.java b/hibernate-core/src/main/java/org/hibernate/boot/models/xml/internal/ManagedTypeProcessor.java index 0fa0e0fe63..d4fb79c34d 100644 --- a/hibernate-core/src/main/java/org/hibernate/boot/models/xml/internal/ManagedTypeProcessor.java +++ b/hibernate-core/src/main/java/org/hibernate/boot/models/xml/internal/ManagedTypeProcessor.java @@ -517,6 +517,7 @@ private static void processEntityMetadata( } XmlAnnotationHelper.applyTable( jaxbEntity.getTable(), classDetails, xmlDocumentContext ); + XmlAnnotationHelper.applySecondaryTables( jaxbEntity.getSecondaryTables(), classDetails, xmlDocumentContext ); final JaxbAttributesContainerImpl attributes = jaxbEntity.getAttributes(); if ( attributes != null ) { 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 c3f17f7eb3..e317481ceb 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 @@ -53,7 +53,6 @@ import org.hibernate.boot.jaxb.mapping.spi.JaxbElementCollectionImpl; import org.hibernate.boot.jaxb.mapping.spi.JaxbEntity; import org.hibernate.boot.jaxb.mapping.spi.JaxbEntityListenerContainerImpl; -import org.hibernate.boot.jaxb.mapping.spi.JaxbEntityListenerImpl; import org.hibernate.boot.jaxb.mapping.spi.JaxbEntityOrMappedSuperclass; import org.hibernate.boot.jaxb.mapping.spi.JaxbGeneratedValueImpl; import org.hibernate.boot.jaxb.mapping.spi.JaxbHbmFilterImpl; @@ -63,12 +62,12 @@ import org.hibernate.boot.jaxb.mapping.spi.JaxbLifecycleCallback; import org.hibernate.boot.jaxb.mapping.spi.JaxbLifecycleCallbackContainer; import org.hibernate.boot.jaxb.mapping.spi.JaxbLobImpl; -import org.hibernate.boot.jaxb.mapping.spi.JaxbManyToManyImpl; import org.hibernate.boot.jaxb.mapping.spi.JaxbNationalizedImpl; import org.hibernate.boot.jaxb.mapping.spi.JaxbNaturalId; import org.hibernate.boot.jaxb.mapping.spi.JaxbNotFoundCapable; import org.hibernate.boot.jaxb.mapping.spi.JaxbPluralAttribute; import org.hibernate.boot.jaxb.mapping.spi.JaxbSchemaAware; +import org.hibernate.boot.jaxb.mapping.spi.JaxbSecondaryTableImpl; import org.hibernate.boot.jaxb.mapping.spi.JaxbSequenceGeneratorImpl; import org.hibernate.boot.jaxb.mapping.spi.JaxbTableGeneratorImpl; import org.hibernate.boot.jaxb.mapping.spi.JaxbTableImpl; @@ -88,7 +87,6 @@ import org.hibernate.boot.models.xml.internal.db.TableProcessing; import org.hibernate.boot.models.xml.spi.XmlDocument; import org.hibernate.boot.models.xml.spi.XmlDocumentContext; -import org.hibernate.cfg.AvailableSettings; import org.hibernate.engine.spi.ExecuteUpdateResultCheckStyle; import org.hibernate.internal.util.KeyedConsumer; import org.hibernate.internal.util.StringHelper; @@ -125,6 +123,8 @@ import jakarta.persistence.IdClass; import jakarta.persistence.Index; import jakarta.persistence.Inheritance; +import jakarta.persistence.SecondaryTable; +import jakarta.persistence.SecondaryTables; import jakarta.persistence.SequenceGenerator; import jakarta.persistence.Table; import jakarta.persistence.TableGenerator; @@ -1500,4 +1500,43 @@ public static void applyNotFound( ); notFoundAnn.setAttributeValue( "action", notFoundAction ); } + + public static void applySecondaryTables(List secondaryTables, MutableAnnotationTarget target, XmlDocumentContext xmlDocumentContext) { + if ( secondaryTables == null || secondaryTables.isEmpty() ) { + return; + } + + final MutableAnnotationUsage listenersUsage = target.replaceAnnotationUsage( + JpaAnnotations.SECONDARY_TABLE, + JpaAnnotations.SECONDARY_TABLES, + xmlDocumentContext.getModelBuildingContext() + ); + + final List> values = arrayList( secondaryTables.size() ); + listenersUsage.setAttributeValue( "value", values ); + + for ( JaxbSecondaryTableImpl secondaryTable : secondaryTables ) { + final MutableAnnotationUsage tableAnn = JpaAnnotations.SECONDARY_TABLE + .createUsage( xmlDocumentContext.getModelBuildingContext() ); + tableAnn.setAttributeValue( "name", secondaryTable.getName() ); + + ForeignKeyProcessing.applyForeignKey( secondaryTable.getForeignKey(), tableAnn, xmlDocumentContext ); + + JoinColumnProcessing.applyPrimaryKeyJoinColumns( + secondaryTable.getPrimaryKeyJoinColumn(), + tableAnn, + xmlDocumentContext + ); + + applyTableAttributes( + secondaryTable, + target, + tableAnn, + JpaAnnotations.SECONDARY_TABLE, + xmlDocumentContext + ); + + values.add( tableAnn ); + } + } } diff --git a/hibernate-core/src/main/java/org/hibernate/boot/models/xml/internal/db/ForeignKeyProcessing.java b/hibernate-core/src/main/java/org/hibernate/boot/models/xml/internal/db/ForeignKeyProcessing.java index cf33666797..2f085980c5 100644 --- a/hibernate-core/src/main/java/org/hibernate/boot/models/xml/internal/db/ForeignKeyProcessing.java +++ b/hibernate-core/src/main/java/org/hibernate/boot/models/xml/internal/db/ForeignKeyProcessing.java @@ -6,6 +6,8 @@ */ package org.hibernate.boot.models.xml.internal.db; +import java.lang.annotation.Annotation; + import org.hibernate.boot.jaxb.mapping.spi.JaxbForeignKeyImpl; import org.hibernate.boot.models.JpaAnnotations; import org.hibernate.boot.models.xml.internal.XmlAnnotationHelper; @@ -79,4 +81,38 @@ public static MutableAnnotationUsage createNestedForeignKeyAnnotatio return foreignKeyUsage; } + + public static void applyForeignKey( + JaxbForeignKeyImpl jaxbForeignKey, + MutableAnnotationUsage tableAnn, + XmlDocumentContext xmlDocumentContext) { + if ( jaxbForeignKey == null ) { + return; + } + final MutableAnnotationUsage foreignKeyUsage = JpaAnnotations.FOREIGN_KEY.createUsage( + xmlDocumentContext.getModelBuildingContext() + ); + + XmlAnnotationHelper.applyOptionalAttribute( foreignKeyUsage, "name", jaxbForeignKey.getName() ); + XmlAnnotationHelper.applyOptionalAttribute( + foreignKeyUsage, + "value", + jaxbForeignKey.getConstraintMode() + ); + XmlAnnotationHelper.applyOptionalAttribute( + foreignKeyUsage, + "foreignKeyDefinition", + jaxbForeignKey.getForeignKeyDefinition() + ); + XmlAnnotationHelper.applyOptionalAttribute( + foreignKeyUsage, + "options", + jaxbForeignKey.getOptions() + ); + + tableAnn.setAttributeValue( + "foreignkey", + foreignKeyUsage + );; + } } diff --git a/hibernate-core/src/main/java/org/hibernate/boot/models/xml/internal/db/JoinColumnProcessing.java b/hibernate-core/src/main/java/org/hibernate/boot/models/xml/internal/db/JoinColumnProcessing.java index 127913f345..4e82ff80ad 100644 --- a/hibernate-core/src/main/java/org/hibernate/boot/models/xml/internal/db/JoinColumnProcessing.java +++ b/hibernate-core/src/main/java/org/hibernate/boot/models/xml/internal/db/JoinColumnProcessing.java @@ -183,4 +183,44 @@ public static void applyJoinColumns( ); columnsAnn.setAttributeValue( "value", createJoinColumns( jaxbJoinColumns, memberDetails, xmlDocumentContext ) ); } + + public static void applyPrimaryKeyJoinColumns( + List jaxbJoinColumns, + MutableAnnotationUsage tableAnn, + XmlDocumentContext xmlDocumentContext) { + if ( CollectionHelper.isEmpty( jaxbJoinColumns ) ) { + return; + } + + final List> columnUsages = CollectionHelper.arrayList( jaxbJoinColumns.size() ); + + jaxbJoinColumns.forEach( (jaxbJoinColumn) -> { + final MutableAnnotationUsage columnUsage = + JpaAnnotations.PRIMARY_KEY_JOIN_COLUMN.createUsage( xmlDocumentContext.getModelBuildingContext() ); + columnUsages.add( columnUsage ); + + ColumnProcessing.applyColumnDetails( + jaxbJoinColumn, + (MutableAnnotationUsage) columnUsage, + xmlDocumentContext + ); + XmlAnnotationHelper.applyOptionalAttribute( + columnUsage, + "referencedColumnName", + ((JaxbColumnJoined) jaxbJoinColumn).getReferencedColumnName() + ); + + ForeignKeyProcessing.applyForeignKey( + ( (JaxbColumnJoined) jaxbJoinColumn ).getForeignKey(), + (MutableAnnotationUsage) columnUsage, + xmlDocumentContext + ); + } ); + + tableAnn.setAttributeValue( + "pkJoinColumns", + columnUsages + ); + } + } diff --git a/hibernate-core/src/main/xjb/mapping-bindings.xjb b/hibernate-core/src/main/xjb/mapping-bindings.xjb index 1c71d9d86f..64a9d42c4a 100644 --- a/hibernate-core/src/main/xjb/mapping-bindings.xjb +++ b/hibernate-core/src/main/xjb/mapping-bindings.xjb @@ -420,6 +420,16 @@ + + org.hibernate.boot.jaxb.mapping.spi.db.JaxbTableMapping + + + + + + + + org.hibernate.boot.jaxb.mapping.spi.db.JaxbCheckConstraint diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/schemaupdate/secondarytable/SecondaryTableTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/schemaupdate/secondarytable/SecondaryTableTest.java index f5c55c93ac..d33665bd69 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/schemaupdate/secondarytable/SecondaryTableTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/schemaupdate/secondarytable/SecondaryTableTest.java @@ -10,6 +10,8 @@ import org.hibernate.boot.registry.StandardServiceRegistry; import org.hibernate.boot.registry.StandardServiceRegistryBuilder; import org.hibernate.boot.spi.MetadataImplementor; +import org.hibernate.engine.jdbc.env.spi.NameQualifierSupport; +import org.hibernate.internal.util.StringHelper; import org.hibernate.tool.hbm2ddl.SchemaExport; import org.hibernate.tool.schema.TargetType; @@ -46,16 +48,31 @@ public void tearsDown() { @Test public void testSecondaryTablesAreCreated() throws Exception { createSchema( "org/hibernate/orm/test/schemaupdate/secondarytable/TestEntity.xml" ); + assertTrue( - isTableCreated( output, "CATALOG1.SCHEMA1.SECONDARY_TABLE_1" ), + isTableCreated( output, getExpectedTableName( "SECONDARY_TABLE_1", "SCHEMA1", "CATALOG1" ) ), "Table SECONDARY_TABLE_1 has not been created " ); assertTrue( - isTableCreated( output, "SECONDARY_TABLE_2" ), + isTableCreated( output, getExpectedTableName( "SECONDARY_TABLE_2", null, null ) ), "Table SECONDARY_TABLE_2 has not been created " ); } + private String getExpectedTableName(String tableName, String schema, String catalog) { + String expectedTableName = tableName; + NameQualifierSupport nameQualifierSupport = metadata.getDatabase() + .getJdbcEnvironment() + .getNameQualifierSupport(); + if ( StringHelper.isNotEmpty( schema ) && nameQualifierSupport.supportsSchemas() ) { + expectedTableName = schema + "." + expectedTableName; + } + if ( StringHelper.isNotEmpty( catalog ) && nameQualifierSupport.supportsCatalogs() ) { + expectedTableName = catalog + "." + expectedTableName; + } + return expectedTableName; + } + private static boolean isTableCreated( File output, String tableName) throws Exception {