Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -898,8 +898,6 @@ private void handleHibernateORMWithNoPersistenceXml(
Set<String> modelClassesAndPackagesForDefaultPersistenceUnit = modelClassesAndPackagesPerPersistencesUnits
.getOrDefault(PersistenceUnitUtil.DEFAULT_PERSISTENCE_UNIT_NAME, Collections.emptySet());

Set<String> storageEngineCollector = new HashSet<>();

if (enableDefaultPersistenceUnit) {
producePersistenceUnitDescriptorFromConfig(
hibernateOrmConfig, PersistenceUnitUtil.DEFAULT_PERSISTENCE_UNIT_NAME,
Expand All @@ -908,7 +906,7 @@ private void handleHibernateORMWithNoPersistenceXml(
jpaModel.getXmlMappings(PersistenceUnitUtil.DEFAULT_PERSISTENCE_UNIT_NAME),
jdbcDataSources, applicationArchivesBuildItem, launchMode, capabilities,
systemProperties, nativeImageResources, hotDeploymentWatchedFiles, persistenceUnitDescriptors,
reflectiveMethods, unremovableBeans, storageEngineCollector, dbKindMetadataBuildItems);
reflectiveMethods, unremovableBeans, dbKindMetadataBuildItems);
} else if (!modelClassesAndPackagesForDefaultPersistenceUnit.isEmpty()
&& (!hibernateOrmConfig.defaultPersistenceUnit().datasource().isPresent()
|| DataSourceUtil.isDefault(hibernateOrmConfig.defaultPersistenceUnit().datasource().get()))
Expand All @@ -928,12 +926,7 @@ private void handleHibernateORMWithNoPersistenceXml(
jpaModel.getXmlMappings(persistenceUnitEntry.getKey()),
jdbcDataSources, applicationArchivesBuildItem, launchMode, capabilities,
systemProperties, nativeImageResources, hotDeploymentWatchedFiles, persistenceUnitDescriptors,
reflectiveMethods, unremovableBeans, storageEngineCollector, dbKindMetadataBuildItems);
}

if (storageEngineCollector.size() > 1) {
throw new ConfigurationException(
"The dialect storage engine is a global configuration property: it must be consistent across all persistence units.");
reflectiveMethods, unremovableBeans, dbKindMetadataBuildItems);
}
}

Expand All @@ -953,7 +946,6 @@ private static void producePersistenceUnitDescriptorFromConfig(
BuildProducer<PersistenceUnitDescriptorBuildItem> persistenceUnitDescriptors,
BuildProducer<ReflectiveMethodBuildItem> reflectiveMethods,
BuildProducer<UnremovableBeanBuildItem> unremovableBeans,
Set<String> storageEngineCollector,
List<DatabaseKindDialectBuildItem> dbKindMetadataBuildItems) {
Optional<JdbcDataSourceBuildItem> jdbcDataSource = findJdbcDataSource(persistenceUnitName, persistenceUnitConfig,
jdbcDataSources);
Expand Down Expand Up @@ -984,7 +976,7 @@ private static void producePersistenceUnitDescriptorFromConfig(
Optional<DatabaseKind.SupportedDatabaseKind> supportedDatabaseKind = collectDialectConfig(persistenceUnitName,
persistenceUnitConfig,
dbKindMetadataBuildItems, jdbcDataSource, multiTenancyStrategy,
systemProperties, reflectiveMethods, descriptor.getProperties()::setProperty, storageEngineCollector);
systemProperties, reflectiveMethods, descriptor.getProperties()::setProperty);

configureProperties(descriptor, persistenceUnitConfig, hibernateOrmConfig, false);

Expand Down Expand Up @@ -1025,8 +1017,7 @@ private static Optional<DatabaseKind.SupportedDatabaseKind> collectDialectConfig
MultiTenancyStrategy multiTenancyStrategy,
BuildProducer<SystemPropertyBuildItem> systemProperties,
BuildProducer<ReflectiveMethodBuildItem> reflectiveMethods,
BiConsumer<String, String> puPropertiesCollector,
Set<String> storageEngineCollector) {
BiConsumer<String, String> puPropertiesCollector) {
final HibernateOrmConfigPersistenceUnit.HibernateOrmConfigPersistenceUnitDialect dialectConfig = persistenceUnitConfig
.dialect();

Expand All @@ -1050,10 +1041,8 @@ private static Optional<DatabaseKind.SupportedDatabaseKind> collectDialectConfig
explicitDbMinVersion,
dialectConfig,
dbKindMetadataBuildItems,
persistenceUnitConfig.dialect().storageEngine(),
systemProperties,
puPropertiesCollector,
storageEngineCollector);
puPropertiesCollector);

if ((dbKind.isPresent() && DatabaseKind.isPostgreSQL(dbKind.get())
|| (dialect.isPresent() && dialect.get().toLowerCase(Locale.ROOT).contains("postgres")))) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
import static org.hibernate.cfg.DialectSpecificSettings.ORACLE_AUTONOMOUS_DATABASE;
import static org.hibernate.cfg.DialectSpecificSettings.ORACLE_EXTENDED_STRING_SIZE;
import static org.hibernate.cfg.DialectSpecificSettings.SQL_SERVER_COMPATIBILITY_LEVEL;
import static org.hibernate.cfg.SchemaToolingSettings.STORAGE_ENGINE;

import java.nio.file.Files;
import java.nio.file.Path;
Expand All @@ -18,7 +19,6 @@
import java.util.Optional;
import java.util.OptionalInt;
import java.util.Properties;
import java.util.Set;
import java.util.function.BiConsumer;
import java.util.stream.Collectors;

Expand Down Expand Up @@ -103,10 +103,8 @@ public static Optional<SupportedDatabaseKind> setDialectAndStorageEngine(
Optional<String> explicitDbMinVersion,
HibernateOrmConfigPersistenceUnit.HibernateOrmConfigPersistenceUnitDialect dialectConfig,
List<DatabaseKindDialectBuildItem> dbKindDialectBuildItems,
Optional<String> storageEngine,
BuildProducer<SystemPropertyBuildItem> systemProperties,
BiConsumer<String, String> puPropertiesCollector,
Set<String> storageEngineCollector) {
BiConsumer<String, String> puPropertiesCollector) {
Optional<String> dialect = explicitDialect;
Optional<String> dbProductName = Optional.empty();
Optional<String> dbProductVersion = explicitDbMinVersion;
Expand Down Expand Up @@ -147,9 +145,7 @@ public static Optional<SupportedDatabaseKind> setDialectAndStorageEngine(

Optional<SupportedDatabaseKind> supportedDatabaseKind = handleDialectSpecificSettings(
persistenceUnitName,
systemProperties,
puPropertiesCollector,
storageEngineCollector,
dialectConfig,
dbKind,
dbProductName);
Expand All @@ -159,17 +155,14 @@ public static Optional<SupportedDatabaseKind> setDialectAndStorageEngine(

private static Optional<SupportedDatabaseKind> handleDialectSpecificSettings(
String persistenceUnitName,
BuildProducer<SystemPropertyBuildItem> systemProperties,
BiConsumer<String, String> puPropertiesCollector,
Set<String> storageEngineCollector,
HibernateOrmConfigPersistenceUnit.HibernateOrmConfigPersistenceUnitDialect dialectConfig,
Optional<String> dbKind,
Optional<String> dbProductName) {

final Optional<SupportedDatabaseKind> databaseKind = determineDatabaseKind(dbKind, dbProductName);

handleStorageEngine(databaseKind, persistenceUnitName, dialectConfig, storageEngineCollector,
systemProperties);
handleStorageEngine(databaseKind, persistenceUnitName, dialectConfig, puPropertiesCollector);

if (dialectConfig.mariadb().bytesPerCharacter().isPresent()
|| dialectConfig.mariadb().noBackslashEscapes().isPresent()) {
Expand Down Expand Up @@ -268,8 +261,7 @@ private static void handleStorageEngine(
Optional<SupportedDatabaseKind> supportedDatabaseKind,
String persistenceUnitName,
HibernateOrmConfigPersistenceUnit.HibernateOrmConfigPersistenceUnitDialect dialectConfig,
Set<String> storageEngineCollector,
BuildProducer<SystemPropertyBuildItem> systemProperties) {
BiConsumer<String, String> puPropertiesCollector) {

final String topLevelStorageEngine = dialectConfig.storageEngine().orElse(null);

Expand All @@ -289,9 +281,9 @@ private static void handleStorageEngine(
&& (supportedDatabaseKind.get() == SupportedDatabaseKind.MARIADB ||
supportedDatabaseKind.get() == SupportedDatabaseKind.MYSQL)) {
if (mariaDbStorageEngine != null) {
addStorageEngine(storageEngineCollector, systemProperties, mariaDbStorageEngine);
addStorageEngine(mariaDbStorageEngine, puPropertiesCollector);
} else if (mysqlDbStorageEngine != null) {
addStorageEngine(storageEngineCollector, systemProperties, mysqlDbStorageEngine);
addStorageEngine(mysqlDbStorageEngine, puPropertiesCollector);
}
} else {
final String storageEngine;
Expand All @@ -302,11 +294,11 @@ private static void handleStorageEngine(
} else if (mariaDbStorageEngine != null) {
storageEngine = mariaDbStorageEngine;
storageEngineSource = HibernateOrmRuntimeConfig.puPropertyKey(persistenceUnitName,
"dialect.mariadb.storage-engine");
"dialect.storage-engine");
} else if (mysqlDbStorageEngine != null) {
storageEngine = mysqlDbStorageEngine;
storageEngineSource = HibernateOrmRuntimeConfig.puPropertyKey(persistenceUnitName,
"dialect.mysql.storage-engine");
"dialect.storage-engine");
} else {
storageEngine = null;
storageEngineSource = null;
Expand All @@ -319,17 +311,14 @@ private static void handleStorageEngine(
+ " because the database is neither MySQL nor MariaDB.",
storageEngineSource);
} else {
systemProperties.produce(new SystemPropertyBuildItem(AvailableSettings.STORAGE_ENGINE, storageEngine));
storageEngineCollector.add(storageEngine);
addStorageEngine(storageEngine, puPropertiesCollector);
}
}
}
}

private static void addStorageEngine(Set<String> storageEngineCollector,
BuildProducer<SystemPropertyBuildItem> systemProperties, String mariaDbStorageEngine) {
storageEngineCollector.add(mariaDbStorageEngine);
systemProperties.produce(new SystemPropertyBuildItem(AvailableSettings.STORAGE_ENGINE, mariaDbStorageEngine));
private static void addStorageEngine(String storageEngine, BiConsumer<String, String> puPropertiesCollector) {
puPropertiesCollector.accept(STORAGE_ENGINE, storageEngine);
}

private static void applyOptionalStringSetting(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,13 @@
import static org.assertj.core.api.Assertions.assertThat;

import java.util.List;
import java.util.Locale;

import jakarta.inject.Inject;
import jakarta.persistence.EntityManagerFactory;

import org.hibernate.dialect.Dialect;
import org.hibernate.internal.SessionFactoryImpl;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.RegisterExtension;

Expand All @@ -18,6 +24,9 @@
*/
public class StorageSpecificMariaDBTest {

@Inject
EntityManagerFactory entityManagerFactory;

@RegisterExtension
static QuarkusUnitTest runner = new QuarkusUnitTest()
.withApplicationRoot((jar) -> jar
Expand All @@ -31,6 +40,7 @@ public class StorageSpecificMariaDBTest {

@Test
public void applicationStarts() {
assertThat(System.getProperty("hibernate.dialect.storage_engine")).isEqualTo("innodb");
Dialect dialect = entityManagerFactory.unwrap(SessionFactoryImpl.class).getJdbcServices().getDialect();
assertThat(dialect.getTableTypeString().toLowerCase(Locale.ROOT)).contains("innodb");
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,13 @@
import static org.assertj.core.api.Assertions.assertThat;

import java.util.List;
import java.util.Locale;

import jakarta.inject.Inject;
import jakarta.persistence.EntityManagerFactory;

import org.hibernate.dialect.Dialect;
import org.hibernate.internal.SessionFactoryImpl;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.RegisterExtension;

Expand All @@ -18,6 +24,9 @@
*/
public class StorageSpecificMysqlDBTest {

@Inject
EntityManagerFactory entityManagerFactory;

@RegisterExtension
static QuarkusUnitTest runner = new QuarkusUnitTest()
.withApplicationRoot((jar) -> jar
Expand All @@ -31,6 +40,7 @@ public class StorageSpecificMysqlDBTest {

@Test
public void applicationStarts() {
assertThat(System.getProperty("hibernate.dialect.storage_engine")).isEqualTo("innodb");
Dialect dialect = entityManagerFactory.unwrap(SessionFactoryImpl.class).getJdbcServices().getDialect();
assertThat(dialect.getTableTypeString().toLowerCase(Locale.ROOT)).contains("innodb");
}
}

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,6 @@

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Optional;
Expand Down Expand Up @@ -379,8 +378,6 @@ private static QuarkusPersistenceUnitDescriptorWithSupportedDBKind generateReact
new Properties(),
true);

Set<String> storageEngineCollector = new HashSet<>();

HibernateOrmConfigPersistenceUnit.HibernateOrmConfigPersistenceUnitDialect dialectConfig = persistenceUnitConfig
.dialect();
Optional<DatabaseKind.SupportedDatabaseKind> supportedDatabaseKind = setDialectAndStorageEngine(
Expand All @@ -390,10 +387,8 @@ private static QuarkusPersistenceUnitDescriptorWithSupportedDBKind generateReact
explicitDbMinVersion,
dialectConfig,
dbKindDialectBuildItems,
persistenceUnitConfig.dialect().storageEngine(),
systemProperties,
descriptor.getProperties()::setProperty,
storageEngineCollector);
descriptor.getProperties()::setProperty);

configureProperties(descriptor, persistenceUnitConfig, hibernateOrmConfig, true);
configureSqlLoadScript(persistenceUnitName, persistenceUnitConfig, applicationArchivesBuildItem, launchMode,
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
package io.quarkus.it.jpa.mariadb;

import java.io.IOException;

import jakarta.inject.Inject;
import jakarta.ws.rs.GET;
import jakarta.ws.rs.Path;
import jakarta.ws.rs.Produces;
import jakarta.ws.rs.core.MediaType;

import org.hibernate.SessionFactory;
import org.hibernate.dialect.MariaDBDialect;
import org.hibernate.engine.spi.SessionFactoryImplementor;

import io.quarkus.hibernate.orm.PersistenceUnit;

@Path("/offline2/dialect")
@Produces(MediaType.APPLICATION_JSON)
public class Offline2DialectEndpoint {
@Inject
@PersistenceUnit("offline2")
SessionFactory sessionFactory;

@GET
public OfflineDialectDescriptor test() throws IOException {
return new OfflineDialectDescriptor(
(MariaDBDialect) sessionFactory.unwrap(SessionFactoryImplementor.class).getJdbcServices().getDialect());
}
}
Original file line number Diff line number Diff line change
@@ -1,17 +1,23 @@
package io.quarkus.it.jpa.mariadb;

import java.util.Locale;

import org.hibernate.dialect.MariaDBDialect;

public class OfflineDialectDescriptor {
private Integer bytesPerCharacter;
private Boolean noBackslashEscapes;
private String storageEngine;

public OfflineDialectDescriptor(MariaDBDialect dialect, String storageEngine) {
public OfflineDialectDescriptor(MariaDBDialect dialect) {
this(
determineBytesPerCharacter(dialect),
dialect.isNoBackslashEscapesEnabled(),
storageEngine);
determineStorageEngine(dialect));
}

private static String determineStorageEngine(MariaDBDialect dialect) {
return dialect.getTableTypeString().toLowerCase(Locale.ROOT).replace("engine=", "").trim();
}

private static Integer determineBytesPerCharacter(MariaDBDialect dialect) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@
import jakarta.ws.rs.core.MediaType;

import org.hibernate.SessionFactory;
import org.hibernate.cfg.AvailableSettings;
import org.hibernate.dialect.MariaDBDialect;
import org.hibernate.engine.spi.SessionFactoryImplementor;

Expand All @@ -25,9 +24,6 @@ public class OfflineDialectEndpoint {
@GET
public OfflineDialectDescriptor test() throws IOException {
return new OfflineDialectDescriptor(
(MariaDBDialect) sessionFactory.unwrap(SessionFactoryImplementor.class).getJdbcServices().getDialect(),
(String) sessionFactory.unwrap(SessionFactoryImplementor.class)
.getProperties()
.get(AvailableSettings.STORAGE_ENGINE));
(MariaDBDialect) sessionFactory.unwrap(SessionFactoryImplementor.class).getJdbcServices().getDialect());
}
}
Loading