From 4e113f94834149dcd9592ff1b3d3cfba762074ce Mon Sep 17 00:00:00 2001 From: Avgustin Marinov Date: Fri, 21 Mar 2025 16:48:14 +0200 Subject: [PATCH] Hibernate: use default HibernateJpaConfiguration (#2325) Condifure properties via HibernatePropertiesCustomizer Signed-off-by: Avgustin Marinov --- .../hawkbit/app/ddi/AllowedHostNamesTest.java | 1 + .../java/org/eclipse/hawkbit/mgmt/sdfs.java | 13 +++ .../repository/jpa/JpaConfiguration.java | 82 ++++++------------- 3 files changed, 41 insertions(+), 55 deletions(-) create mode 100644 hawkbit-mgmt/hawkbit-mgmt-api/src/main/java/org/eclipse/hawkbit/mgmt/sdfs.java diff --git a/hawkbit-ddi/hawkbit-ddi-server/src/test/java/org/eclipse/hawkbit/app/ddi/AllowedHostNamesTest.java b/hawkbit-ddi/hawkbit-ddi-server/src/test/java/org/eclipse/hawkbit/app/ddi/AllowedHostNamesTest.java index 734ac6a9b..3744fc34c 100644 --- a/hawkbit-ddi/hawkbit-ddi-server/src/test/java/org/eclipse/hawkbit/app/ddi/AllowedHostNamesTest.java +++ b/hawkbit-ddi/hawkbit-ddi-server/src/test/java/org/eclipse/hawkbit/app/ddi/AllowedHostNamesTest.java @@ -20,6 +20,7 @@ import org.springframework.http.HttpHeaders; import org.springframework.test.context.TestPropertySource; @TestPropertySource(properties = { + "spring.flyway.enabled=true", // if hibernate is used there could be db inconsistencies when executing tests with and without flyway "hawkbit.server.security.allowedHostNames=localhost", "hawkbit.server.security.httpFirewallIgnoredPaths=/index.html" }) @Feature("Integration Test - Security") diff --git a/hawkbit-mgmt/hawkbit-mgmt-api/src/main/java/org/eclipse/hawkbit/mgmt/sdfs.java b/hawkbit-mgmt/hawkbit-mgmt-api/src/main/java/org/eclipse/hawkbit/mgmt/sdfs.java new file mode 100644 index 000000000..93db7cb2c --- /dev/null +++ b/hawkbit-mgmt/hawkbit-mgmt-api/src/main/java/org/eclipse/hawkbit/mgmt/sdfs.java @@ -0,0 +1,13 @@ +/** + * Copyright (c) 2025 Contributors to the Eclipse Foundation + * + * This program and the accompanying materials are made + * available under the terms of the Eclipse Public License 2.0 + * which is available at https://www.eclipse.org/legal/epl-2.0/ + * + * SPDX-License-Identifier: EPL-2.0 + */ +package org.eclipse.hawkbit.mgmt; + +public class sdfs { +} diff --git a/hawkbit-repository/hawkbit-repository-jpa-hibernate/src/main/java/org/eclipse/hawkbit/repository/jpa/JpaConfiguration.java b/hawkbit-repository/hawkbit-repository-jpa-hibernate/src/main/java/org/eclipse/hawkbit/repository/jpa/JpaConfiguration.java index b2d3b8e82..3a89a9337 100644 --- a/hawkbit-repository/hawkbit-repository-jpa-hibernate/src/main/java/org/eclipse/hawkbit/repository/jpa/JpaConfiguration.java +++ b/hawkbit-repository/hawkbit-repository-jpa-hibernate/src/main/java/org/eclipse/hawkbit/repository/jpa/JpaConfiguration.java @@ -10,12 +10,6 @@ package org.eclipse.hawkbit.repository.jpa; import java.util.Collections; -import java.util.HashMap; -import java.util.LinkedHashMap; -import java.util.Map; -import java.util.function.Supplier; - -import javax.sql.DataSource; import org.eclipse.hawkbit.repository.jpa.model.EntityPropertyChangeListener; @@ -30,33 +24,23 @@ import org.hibernate.event.spi.EventType; import org.hibernate.integrator.spi.Integrator; import org.hibernate.jpa.boot.spi.IntegratorProvider; import org.hibernate.service.spi.SessionFactoryServiceRegistry; -import org.springframework.beans.factory.ObjectProvider; import org.springframework.beans.factory.annotation.Value; -import org.springframework.boot.autoconfigure.orm.jpa.HibernateSettings; -import org.springframework.boot.autoconfigure.orm.jpa.JpaBaseConfiguration; -import org.springframework.boot.autoconfigure.orm.jpa.JpaProperties; +import org.springframework.boot.autoconfigure.orm.jpa.HibernatePropertiesCustomizer; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import org.springframework.orm.jpa.vendor.AbstractJpaVendorAdapter; -import org.springframework.orm.jpa.vendor.HibernateJpaDialect; -import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter; -import org.springframework.transaction.jta.JtaTransactionManager; /** * General Hibernate configuration for hawkBit's Repository. */ @Configuration -public class JpaConfiguration extends JpaBaseConfiguration { +public class JpaConfiguration { private final TenantIdentifier tenantIdentifier; private final boolean enableLazyLoadNoTrans; protected JpaConfiguration( - final DataSource dataSource, final JpaProperties properties, - final ObjectProvider jtaTransactionManagerProvider, final TenantAware.TenantResolver tenantResolver, @Value("${hibernate.enable_lazy_load_no_trans:true}") final boolean enableLazyLoadNoTrans) { - super(dataSource, properties, jtaTransactionManagerProvider); tenantIdentifier = new TenantIdentifier(tenantResolver); this.enableLazyLoadNoTrans = enableLazyLoadNoTrans; } @@ -66,45 +50,33 @@ public class JpaConfiguration extends JpaBaseConfiguration { return tenantIdentifier; } - @Override - protected AbstractJpaVendorAdapter createJpaVendorAdapter() { - return new HibernateJpaVendorAdapter() { + @Bean + HibernatePropertiesCustomizer hibernatePropertiesCustomizers() { + return hibernateProperties -> { + // override the default naming strategy + hibernateProperties.put("hibernate.physical_naming_strategy", org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl.class.getName()); + hibernateProperties.put(MultiTenancySettings.MULTI_TENANT_IDENTIFIER_RESOLVER, tenantIdentifier); + hibernateProperties.put("hibernate.multiTenancy", "DISCRIMINATOR"); + // LAZY_LOAD - Enable lazy loading of lazy fields when session is closed - N + 1 problem occur. + // So it would be good if in future hawkBit run without that + // Otherwise, if false, call for the lazy field will throw LazyInitializationException + hibernateProperties.put("hibernate.enable_lazy_load_no_trans", enableLazyLoadNoTrans); + hibernateProperties.put("hibernate.integrator_provider", (IntegratorProvider) () -> Collections.singletonList(new Integrator() { - private final HibernateJpaDialect jpaDialect = new HibernateJpaDialect(); + @Override + public void integrate( + final Metadata metadata, final BootstrapContext bootstrapContext, + final SessionFactoryImplementor sessionFactory) { + sessionFactory.getServiceRegistry() + .getService(EventListenerRegistry.class) + .appendListeners(EventType.POST_UPDATE, new EntityPropertyChangeListener()); + } - @Override - public HibernateJpaDialect getJpaDialect() { - return jpaDialect; - } + @Override + public void disintegrate(final SessionFactoryImplementor sessionFactory, final SessionFactoryServiceRegistry serviceRegistry) { + // do nothing + } + })); }; } - - @Override - protected Map getVendorProperties(final DataSource dataSource) { - final Map properties = new HashMap<>(4); - - properties.put(MultiTenancySettings.MULTI_TENANT_IDENTIFIER_RESOLVER, tenantIdentifier); - properties.put("hibernate.multiTenancy", "DISCRIMINATOR"); - // LAZY_LOAD - Enable lazy loading of lazy fields when session is closed - N + 1 problem occur. - // So it would be good if in future hawkBit run without that - // Otherwise, if false, call for the lazy field will throw LazyInitializationException - properties.put("hibernate.enable_lazy_load_no_trans", enableLazyLoadNoTrans); - properties.put("hibernate.integrator_provider", (IntegratorProvider) () -> Collections.singletonList(new Integrator() { - - @Override - public void integrate( - final Metadata metadata, final BootstrapContext bootstrapContext, - final SessionFactoryImplementor sessionFactory) { - sessionFactory.getServiceRegistry() - .getService(EventListenerRegistry.class) - .appendListeners(EventType.POST_UPDATE, new EntityPropertyChangeListener()); - } - - @Override - public void disintegrate(final SessionFactoryImplementor sessionFactory, final SessionFactoryServiceRegistry serviceRegistry) { - // do nothing - } - })); - return properties; - } } \ No newline at end of file