From c7f02f0c521d3d08cdde7de79ed7714b1118c658 Mon Sep 17 00:00:00 2001 From: Houssam El Mansouri Date: Mon, 22 Sep 2025 13:15:42 +0100 Subject: [PATCH 1/2] Add support for Hibernate's hibernate.hbm2ddl.extra_physical_table_types --- .../properties/ConfigPropertiesTest.java | 29 ++++++++++++++++++- .../FastBootHibernatePersistenceProvider.java | 7 +++++ ...ernateOrmRuntimeConfigPersistenceUnit.java | 14 +++++++++ ...tHibernateReactivePersistenceProvider.java | 7 +++++ 4 files changed, 56 insertions(+), 1 deletion(-) diff --git a/extensions/hibernate-orm/deployment/src/test/java/io/quarkus/hibernate/orm/config/properties/ConfigPropertiesTest.java b/extensions/hibernate-orm/deployment/src/test/java/io/quarkus/hibernate/orm/config/properties/ConfigPropertiesTest.java index 2d7211ddc7eb2..e6843ec8ee4a9 100644 --- a/extensions/hibernate-orm/deployment/src/test/java/io/quarkus/hibernate/orm/config/properties/ConfigPropertiesTest.java +++ b/extensions/hibernate-orm/deployment/src/test/java/io/quarkus/hibernate/orm/config/properties/ConfigPropertiesTest.java @@ -7,6 +7,7 @@ import org.hibernate.FlushMode; import org.hibernate.Session; +import org.hibernate.cfg.AvailableSettings; import org.jboss.shrinkwrap.api.ShrinkWrap; import org.jboss.shrinkwrap.api.spec.JavaArchive; import org.junit.jupiter.api.Test; @@ -32,7 +33,17 @@ public class ConfigPropertiesTest { .overrideConfigKey("quarkus.hibernate-orm.\"overrides\".packages", MyEntityForOverridesPU.class.getPackageName()) .overrideConfigKey("quarkus.hibernate-orm.\"overrides\".datasource", "") // Overrides to test that Quarkus configuration properties are taken into account - .overrideConfigKey("quarkus.hibernate-orm.\"overrides\".flush.mode", "always"); + .overrideConfigKey("quarkus.hibernate-orm.\"overrides\".flush.mode", "always") + .overrideConfigKey("quarkus.hibernate-orm.schema-management.extra-physical-table-types", + "MATERIALIZED VIEW,FOREIGN TABLE") + .overrideConfigKey("quarkus.hibernate-orm.\"*\".schema-management.extra-physical-table-types", + "MATERIALIZED VIEW,FOREIGN TABLE") + .overrideConfigKey("quarkus.hibernate-orm.\"overrides\".schema-management.extra-physical-table-types", + "MATERIALIZED VIEW,FOREIGN TABLE") + // Disable metrics to avoid requiring metrics deployment artifacts on test classpath + .overrideConfigKey("quarkus.smallrye-metrics.enabled", "false") + .overrideConfigKey("quarkus.agroal.metrics.enabled", "false") + .overrideConfigKey("quarkus.agroal.enabled", "false"); @Inject Session sessionForDefaultPU; @@ -48,4 +59,20 @@ public void propertiesAffectingSession() { assertThat(sessionForOverridesPU.getHibernateFlushMode()).isEqualTo(FlushMode.ALWAYS); } + @Test + @Transactional + public void extraPhysicalTableTypes() { + // Access the configuration through the SessionFactory properties + Object extraPhysicalTableTypes = sessionForOverridesPU.getSessionFactory() + .getProperties() + .get(AvailableSettings.EXTRA_PHYSICAL_TABLE_TYPES); + + assertThat(extraPhysicalTableTypes).isNotNull(); + assertThat(extraPhysicalTableTypes).isInstanceOf(String.class); + + String tableTypesStr = (String) extraPhysicalTableTypes; + String[] tableTypes = tableTypesStr.split(","); + assertThat(tableTypes).containsExactly("MATERIALIZED VIEW", "FOREIGN TABLE"); + } + } diff --git a/extensions/hibernate-orm/runtime/src/main/java/io/quarkus/hibernate/orm/runtime/FastBootHibernatePersistenceProvider.java b/extensions/hibernate-orm/runtime/src/main/java/io/quarkus/hibernate/orm/runtime/FastBootHibernatePersistenceProvider.java index d045a9232f7c6..a4668c587230b 100644 --- a/extensions/hibernate-orm/runtime/src/main/java/io/quarkus/hibernate/orm/runtime/FastBootHibernatePersistenceProvider.java +++ b/extensions/hibernate-orm/runtime/src/main/java/io/quarkus/hibernate/orm/runtime/FastBootHibernatePersistenceProvider.java @@ -483,6 +483,13 @@ private static void injectRuntimeConfiguration(HibernateOrmRuntimeConfigPersiste "When using offline mode with `quarkus.hibernate-orm.database.start-offline=true`, the schema management strategy `quarkus.hibernate-orm.schema-management.strategy` must be unset or set to `none`"); } + // Pass extraPhysicalTableTypes configuration + Optional extraPhysicalTableTypes = persistenceUnitConfig.schemaManagement().extraPhysicalTableTypes(); + if (extraPhysicalTableTypes.isPresent()) { + String extraTableTypesStr = extraPhysicalTableTypes.get(); + runtimeSettingsBuilder.put(AvailableSettings.EXTRA_PHYSICAL_TABLE_TYPES, extraTableTypesStr); + } + runtimeSettingsBuilder.put(AvailableSettings.JAKARTA_HBM2DDL_DATABASE_ACTION, persistenceUnitConfig.database().generation().generation() .orElse(generationStrategy)); diff --git a/extensions/hibernate-orm/runtime/src/main/java/io/quarkus/hibernate/orm/runtime/HibernateOrmRuntimeConfigPersistenceUnit.java b/extensions/hibernate-orm/runtime/src/main/java/io/quarkus/hibernate/orm/runtime/HibernateOrmRuntimeConfigPersistenceUnit.java index 38a6e70407ce6..29c9200f2d73b 100644 --- a/extensions/hibernate-orm/runtime/src/main/java/io/quarkus/hibernate/orm/runtime/HibernateOrmRuntimeConfigPersistenceUnit.java +++ b/extensions/hibernate-orm/runtime/src/main/java/io/quarkus/hibernate/orm/runtime/HibernateOrmRuntimeConfigPersistenceUnit.java @@ -172,6 +172,20 @@ interface HibernateOrmConfigPersistenceUnitSchemaManagement { */ @WithDefault("false") boolean haltOnError(); + + /** + * Additional database object types to include in schema management operations. + * + * By default, Hibernate ORM only considers tables and sequences when performing + * schema management operations. + * This setting allows you to specify additional database object types that should be included, + * such as "MATERIALIZED VIEW", "VIEW", or other database-specific object types. + * + * The exact supported values depend on the underlying database and dialect. + * + * @asciidoclet + */ + Optional<@WithConverter(TrimmedStringConverter.class) String> extraPhysicalTableTypes(); } @ConfigGroup diff --git a/extensions/hibernate-reactive/runtime/src/main/java/io/quarkus/hibernate/reactive/runtime/FastBootHibernateReactivePersistenceProvider.java b/extensions/hibernate-reactive/runtime/src/main/java/io/quarkus/hibernate/reactive/runtime/FastBootHibernateReactivePersistenceProvider.java index ba031ae12a4c2..dccd63862c067 100644 --- a/extensions/hibernate-reactive/runtime/src/main/java/io/quarkus/hibernate/reactive/runtime/FastBootHibernateReactivePersistenceProvider.java +++ b/extensions/hibernate-reactive/runtime/src/main/java/io/quarkus/hibernate/reactive/runtime/FastBootHibernateReactivePersistenceProvider.java @@ -383,6 +383,13 @@ private static void injectRuntimeConfiguration(HibernateOrmRuntimeConfigPersiste "When using offline mode with `quarkus.hibernate-orm.database.start-offline=true`, the schema management strategy `quarkus.hibernate-orm.schema-management.strategy` must be unset or set to `none`"); } + // Pass extraPhysicalTableTypes configuration + Optional extraPhysicalTableTypes = persistenceUnitConfig.schemaManagement().extraPhysicalTableTypes(); + if (extraPhysicalTableTypes.isPresent()) { + String extraTableTypesStr = extraPhysicalTableTypes.get(); + runtimeSettingsBuilder.put(AvailableSettings.EXTRA_PHYSICAL_TABLE_TYPES, extraTableTypesStr); + } + // Database runtimeSettingsBuilder.put(AvailableSettings.JAKARTA_HBM2DDL_DATABASE_ACTION, persistenceUnitConfig.database().generation().generation() From f8684dfaeea60accae7d8ef4cdacb913926b7439 Mon Sep 17 00:00:00 2001 From: Houssam El Mansouri Date: Mon, 22 Sep 2025 13:49:52 +0100 Subject: [PATCH 2/2] Add support for Hibernate's hibernate.hbm2ddl.extra_physical_table_types --- .../orm/config/properties/ConfigPropertiesTest.java | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/extensions/hibernate-orm/deployment/src/test/java/io/quarkus/hibernate/orm/config/properties/ConfigPropertiesTest.java b/extensions/hibernate-orm/deployment/src/test/java/io/quarkus/hibernate/orm/config/properties/ConfigPropertiesTest.java index e6843ec8ee4a9..a23a6c0c5155d 100644 --- a/extensions/hibernate-orm/deployment/src/test/java/io/quarkus/hibernate/orm/config/properties/ConfigPropertiesTest.java +++ b/extensions/hibernate-orm/deployment/src/test/java/io/quarkus/hibernate/orm/config/properties/ConfigPropertiesTest.java @@ -34,16 +34,8 @@ public class ConfigPropertiesTest { .overrideConfigKey("quarkus.hibernate-orm.\"overrides\".datasource", "") // Overrides to test that Quarkus configuration properties are taken into account .overrideConfigKey("quarkus.hibernate-orm.\"overrides\".flush.mode", "always") - .overrideConfigKey("quarkus.hibernate-orm.schema-management.extra-physical-table-types", - "MATERIALIZED VIEW,FOREIGN TABLE") - .overrideConfigKey("quarkus.hibernate-orm.\"*\".schema-management.extra-physical-table-types", - "MATERIALIZED VIEW,FOREIGN TABLE") .overrideConfigKey("quarkus.hibernate-orm.\"overrides\".schema-management.extra-physical-table-types", - "MATERIALIZED VIEW,FOREIGN TABLE") - // Disable metrics to avoid requiring metrics deployment artifacts on test classpath - .overrideConfigKey("quarkus.smallrye-metrics.enabled", "false") - .overrideConfigKey("quarkus.agroal.metrics.enabled", "false") - .overrideConfigKey("quarkus.agroal.enabled", "false"); + "MATERIALIZED VIEW,FOREIGN TABLE"); @Inject Session sessionForDefaultPU;