|  | 
| 7 | 7 | import static org.hibernate.cfg.AvailableSettings.USE_DIRECT_REFERENCE_CACHE_ENTRIES; | 
| 8 | 8 | import static org.hibernate.cfg.AvailableSettings.USE_QUERY_CACHE; | 
| 9 | 9 | import static org.hibernate.cfg.AvailableSettings.USE_SECOND_LEVEL_CACHE; | 
|  | 10 | +import static org.hibernate.cfg.DialectSpecificSettings.COCKROACH_VERSION_STRING; | 
|  | 11 | +import static org.hibernate.cfg.DialectSpecificSettings.HANA_MAX_LOB_PREFETCH_SIZE; | 
|  | 12 | +import static org.hibernate.cfg.DialectSpecificSettings.MYSQL_BYTES_PER_CHARACTER; | 
|  | 13 | +import static org.hibernate.cfg.DialectSpecificSettings.MYSQL_NO_BACKSLASH_ESCAPES; | 
|  | 14 | +import static org.hibernate.cfg.DialectSpecificSettings.ORACLE_APPLICATION_CONTINUITY; | 
|  | 15 | +import static org.hibernate.cfg.DialectSpecificSettings.ORACLE_AUTONOMOUS_DATABASE; | 
|  | 16 | +import static org.hibernate.cfg.DialectSpecificSettings.ORACLE_EXTENDED_STRING_SIZE; | 
|  | 17 | +import static org.hibernate.cfg.DialectSpecificSettings.SQL_SERVER_COMPATIBILITY_LEVEL; | 
|  | 18 | +import static org.hibernate.cfg.DialectSpecificSettings.SYBASE_ANSI_NULL; | 
| 10 | 19 | 
 | 
| 11 | 20 | import java.io.IOException; | 
| 12 | 21 | import java.net.URL; | 
| @@ -1117,7 +1126,10 @@ private static void collectDialectConfig(String persistenceUnitName, | 
| 1117 | 1126 |             MultiTenancyStrategy multiTenancyStrategy, | 
| 1118 | 1127 |             BuildProducer<SystemPropertyBuildItem> systemProperties, | 
| 1119 | 1128 |             BiConsumer<String, String> puPropertiesCollector, Set<String> storageEngineCollector) { | 
| 1120 |  | -        Optional<String> explicitDialect = persistenceUnitConfig.dialect().dialect(); | 
|  | 1129 | +        final HibernateOrmConfigPersistenceUnit.HibernateOrmConfigPersistenceUnitDialect dialectConfig = persistenceUnitConfig | 
|  | 1130 | +                .dialect(); | 
|  | 1131 | + | 
|  | 1132 | +        Optional<String> explicitDialect = dialectConfig.dialect(); | 
| 1121 | 1133 |         Optional<String> dbKind = jdbcDataSource.map(JdbcDataSourceBuildItem::getDbKind); | 
| 1122 | 1134 |         Optional<String> explicitDbMinVersion = jdbcDataSource.flatMap(JdbcDataSourceBuildItem::getDbVersion); | 
| 1123 | 1135 |         if (multiTenancyStrategy != MultiTenancyStrategy.DATABASE && jdbcDataSource.isEmpty()) { | 
| @@ -1174,24 +1186,103 @@ private static void collectDialectConfig(String persistenceUnitName, | 
| 1174 | 1186 |                     persistenceUnitName)); | 
| 1175 | 1187 |         } | 
| 1176 | 1188 | 
 | 
| 1177 |  | -        if (persistenceUnitConfig.dialect().storageEngine().isPresent()) { | 
| 1178 |  | -            // Only actually set the storage engines if MySQL or MariaDB | 
| 1179 |  | -            if (isMySQLOrMariaDB(dbKind, dialect)) { | 
| 1180 |  | -                // The storage engine has to be set as a system property. | 
| 1181 |  | -                // We record it so that we can later run checks (because we can only set a single value) | 
| 1182 |  | -                storageEngineCollector.add(persistenceUnitConfig.dialect().storageEngine().get()); | 
| 1183 |  | -                systemProperties.produce(new SystemPropertyBuildItem(AvailableSettings.STORAGE_ENGINE, | 
| 1184 |  | -                        persistenceUnitConfig.dialect().storageEngine().get())); | 
| 1185 |  | -            } else { | 
|  | 1189 | +        if (dbProductVersion.isPresent()) { | 
|  | 1190 | +            puPropertiesCollector.accept(AvailableSettings.JAKARTA_HBM2DDL_DB_VERSION, dbProductVersion.get()); | 
|  | 1191 | +        } | 
|  | 1192 | + | 
|  | 1193 | +        handleDialectSpecificSettings( | 
|  | 1194 | +                persistenceUnitName, | 
|  | 1195 | +                systemProperties, | 
|  | 1196 | +                puPropertiesCollector, | 
|  | 1197 | +                storageEngineCollector, | 
|  | 1198 | +                dialectConfig, | 
|  | 1199 | +                dbKind, | 
|  | 1200 | +                dialect); | 
|  | 1201 | +    } | 
|  | 1202 | + | 
|  | 1203 | +    private static void handleDialectSpecificSettings( | 
|  | 1204 | +            String persistenceUnitName, | 
|  | 1205 | +            BuildProducer<SystemPropertyBuildItem> systemProperties, | 
|  | 1206 | +            BiConsumer<String, String> puPropertiesCollector, | 
|  | 1207 | +            Set<String> storageEngineCollector, | 
|  | 1208 | +            HibernateOrmConfigPersistenceUnit.HibernateOrmConfigPersistenceUnitDialect dialectConfig, | 
|  | 1209 | +            Optional<String> dbKind, | 
|  | 1210 | +            Optional<String> dialect) { | 
|  | 1211 | + | 
|  | 1212 | +        // todo : do we want dbKind/dialect aware handling for all of these settings (i.e. isMySQLOrMariaDB)? | 
|  | 1213 | +        //      if so, we need to reorganize this code a bit | 
|  | 1214 | + | 
|  | 1215 | +        final Optional<String> storageEngine = dialectConfig.mysql().storageEngine() | 
|  | 1216 | +                .or(() -> dialectConfig.storageEngine().or(Optional::empty)); | 
|  | 1217 | +        if (isMySQLOrMariaDB(dbKind, dialect)) { | 
|  | 1218 | +            if (storageEngine.isPresent()) { | 
|  | 1219 | +                storageEngineCollector.add(storageEngine.get()); | 
|  | 1220 | +                systemProperties.produce(new SystemPropertyBuildItem(AvailableSettings.STORAGE_ENGINE, storageEngine.get())); | 
|  | 1221 | +            } | 
|  | 1222 | +            applyOptionalIntegerSetting(dialectConfig.mysql().bytesPerCharacter(), MYSQL_BYTES_PER_CHARACTER, | 
|  | 1223 | +                    puPropertiesCollector); | 
|  | 1224 | +            applyOptionalBooleanSetting(dialectConfig.mysql().noBackslashEscapes(), MYSQL_NO_BACKSLASH_ESCAPES, | 
|  | 1225 | +                    puPropertiesCollector); | 
|  | 1226 | +        } else { | 
|  | 1227 | +            if (storageEngine.isPresent()) { | 
| 1186 | 1228 |                 LOG.warnf("The storage engine set through configuration property '%1$s' is being ignored" | 
| 1187 | 1229 |                         + " because the database is neither MySQL nor MariaDB.", | 
| 1188 | 1230 |                         HibernateOrmRuntimeConfig.puPropertyKey(persistenceUnitName, "dialect.storage-engine")); | 
| 1189 | 1231 |             } | 
|  | 1232 | + | 
|  | 1233 | +            applyOptionalStringSetting(dialectConfig.cockroach().versionString(), COCKROACH_VERSION_STRING, | 
|  | 1234 | +                    puPropertiesCollector); | 
|  | 1235 | + | 
|  | 1236 | +            applyOptionalIntegerSetting(dialectConfig.hana().maxLobPrefetchSize(), HANA_MAX_LOB_PREFETCH_SIZE, | 
|  | 1237 | +                    puPropertiesCollector); | 
|  | 1238 | + | 
|  | 1239 | +            applyOptionalIntegerSetting(dialectConfig.mysql().bytesPerCharacter(), MYSQL_BYTES_PER_CHARACTER, | 
|  | 1240 | +                    puPropertiesCollector); | 
|  | 1241 | +            applyOptionalBooleanSetting(dialectConfig.mysql().noBackslashEscapes(), MYSQL_NO_BACKSLASH_ESCAPES, | 
|  | 1242 | +                    puPropertiesCollector); | 
|  | 1243 | + | 
|  | 1244 | +            applyOptionalBooleanSetting(dialectConfig.oracle().applicationContinuity(), ORACLE_APPLICATION_CONTINUITY, | 
|  | 1245 | +                    puPropertiesCollector); | 
|  | 1246 | +            applyOptionalBooleanSetting(dialectConfig.oracle().autonomous(), ORACLE_AUTONOMOUS_DATABASE, | 
|  | 1247 | +                    puPropertiesCollector); | 
|  | 1248 | +            applyOptionalBooleanSetting(dialectConfig.oracle().extended(), ORACLE_EXTENDED_STRING_SIZE, | 
|  | 1249 | +                    puPropertiesCollector); | 
|  | 1250 | + | 
|  | 1251 | +            applyOptionalStringSetting(dialectConfig.sqlserver().compatibilityLevel(), SQL_SERVER_COMPATIBILITY_LEVEL, | 
|  | 1252 | +                    puPropertiesCollector); | 
|  | 1253 | + | 
|  | 1254 | +            applyOptionalBooleanSetting(dialectConfig.sybase().ansinull(), SYBASE_ANSI_NULL, puPropertiesCollector); | 
| 1190 | 1255 |         } | 
|  | 1256 | +    } | 
| 1191 | 1257 | 
 | 
| 1192 |  | -        if (dbProductVersion.isPresent()) { | 
| 1193 |  | -            puPropertiesCollector.accept(AvailableSettings.JAKARTA_HBM2DDL_DB_VERSION, dbProductVersion.get()); | 
|  | 1258 | +    private static void applyOptionalStringSetting( | 
|  | 1259 | +            Optional<String> setting, | 
|  | 1260 | +            String settingName, | 
|  | 1261 | +            BiConsumer<String, String> puPropertiesCollector) { | 
|  | 1262 | +        if (setting.isEmpty()) { | 
|  | 1263 | +            return; | 
|  | 1264 | +        } | 
|  | 1265 | +        puPropertiesCollector.accept(settingName, setting.get()); | 
|  | 1266 | +    } | 
|  | 1267 | + | 
|  | 1268 | +    private static void applyOptionalIntegerSetting( | 
|  | 1269 | +            Optional<Integer> setting, | 
|  | 1270 | +            String settingName, | 
|  | 1271 | +            BiConsumer<String, String> puPropertiesCollector) { | 
|  | 1272 | +        if (setting.isEmpty()) { | 
|  | 1273 | +            return; | 
|  | 1274 | +        } | 
|  | 1275 | +        puPropertiesCollector.accept(settingName, Integer.toString(setting.get())); | 
|  | 1276 | +    } | 
|  | 1277 | + | 
|  | 1278 | +    private static void applyOptionalBooleanSetting( | 
|  | 1279 | +            Optional<Boolean> setting, | 
|  | 1280 | +            String settingName, | 
|  | 1281 | +            BiConsumer<String, String> puPropertiesCollector) { | 
|  | 1282 | +        if (setting.isEmpty()) { | 
|  | 1283 | +            return; | 
| 1194 | 1284 |         } | 
|  | 1285 | +        puPropertiesCollector.accept(settingName, Boolean.toString(setting.get())); | 
| 1195 | 1286 |     } | 
| 1196 | 1287 | 
 | 
| 1197 | 1288 |     private static void collectDialectConfigForPersistenceXml(String persistenceUnitName, | 
|  | 
0 commit comments