HHH-14837 - Move to Jakarta EE
improved support for schema tooling settings
This commit is contained in:
parent
3f2d48d7f5
commit
679a919203
|
@ -87,43 +87,43 @@ jar {
|
||||||
attributes(
|
attributes(
|
||||||
'Main-Class': 'org.hibernate.Version',
|
'Main-Class': 'org.hibernate.Version',
|
||||||
|
|
||||||
// BND Plugin instructions (for OSGi):
|
// // BND Plugin instructions (for OSGi):
|
||||||
'Import-Package': [
|
// 'Import-Package': [
|
||||||
'javax.security.auth;resolution:=optional',
|
// 'javax.security.auth;resolution:=optional',
|
||||||
// Make javax.security.jacc optional and do not reference a version range (because that's what we used to do)
|
// // Make javax.security.jacc optional and do not reference a version range (because that's what we used to do)
|
||||||
'javax.security.jacc;resolution:=optional;version=!',
|
// 'javax.security.jacc;resolution:=optional;version=!',
|
||||||
// Make javax.validation optional and do not reference a version range (because that's what we used to do)
|
// // Make javax.validation optional and do not reference a version range (because that's what we used to do)
|
||||||
'javax.validation;resolution:=optional;version=!',
|
// 'javax.validation;resolution:=optional;version=!',
|
||||||
'javax.validation.constraints;resolution:=optional;version=!',
|
// 'javax.validation.constraints;resolution:=optional;version=!',
|
||||||
'javax.validation.groups;resolution:=optional;version=!',
|
// 'javax.validation.groups;resolution:=optional;version=!',
|
||||||
'javax.validation.metadata;resolution:=optional;version=!',
|
// 'javax.validation.metadata;resolution:=optional;version=!',
|
||||||
// Make javax.enterprise optional and do not reference a version range (because that's what we used to do)
|
// // Make javax.enterprise optional and do not reference a version range (because that's what we used to do)
|
||||||
'!javax.enterprise*',
|
// '!javax.enterprise*',
|
||||||
'javax.enterprise.context.spi;resolution:=optional;version=!',
|
// 'javax.enterprise.context.spi;resolution:=optional;version=!',
|
||||||
'javax.enterprise.inject.spi;resolution:=optional;version=!',
|
// 'javax.enterprise.inject.spi;resolution:=optional;version=!',
|
||||||
// For JPA, we don't want to target the automatically generated range, but a specific version
|
// // For JPA, we don't want to target the automatically generated range, but a specific version
|
||||||
"javax.persistence;version=\"${project.jpaVersion.osgiName}\"",
|
// "javax.persistence;version=\"${project.jpaVersion.osgiName}\"",
|
||||||
// optionals
|
// // optionals
|
||||||
'jakarta.persistence.spi;resolution:=optional',
|
// 'jakarta.persistence.spi;resolution:=optional',
|
||||||
'javax.management;resolution:=optional',
|
// 'javax.management;resolution:=optional',
|
||||||
'javax.naming.event;resolution:=optional',
|
// 'javax.naming.event;resolution:=optional',
|
||||||
'javax.naming.spi;resolution:=optional',
|
// 'javax.naming.spi;resolution:=optional',
|
||||||
'org.apache.tools.ant;resolution:=optional',
|
// 'org.apache.tools.ant;resolution:=optional',
|
||||||
'org.apache.tools.ant.taskdefs;resolution:=optional',
|
// 'org.apache.tools.ant.taskdefs;resolution:=optional',
|
||||||
'org.apache.tools.ant.types;resolution:=optional',
|
// 'org.apache.tools.ant.types;resolution:=optional',
|
||||||
'javax.inject;resolution:=optional',
|
// 'javax.inject;resolution:=optional',
|
||||||
'net.bytebuddy.*;resolution:=optional',
|
// 'net.bytebuddy.*;resolution:=optional',
|
||||||
'org.objectweb.jonas_tm;resolution:=optional',
|
// 'org.objectweb.jonas_tm;resolution:=optional',
|
||||||
'com.ibm.websphere.jtaextensions;resolution:=optional',
|
// 'com.ibm.websphere.jtaextensions;resolution:=optional',
|
||||||
// We must specify the version explicitly to allow Karaf
|
// // We must specify the version explicitly to allow Karaf
|
||||||
// to use an older version of JAXB (the only one we can use in Karaf)
|
// // to use an older version of JAXB (the only one we can use in Karaf)
|
||||||
"javax.xml.bind.*;version=\"${project.jaxbApiVersionOsgiRange}\"",
|
// "javax.xml.bind.*;version=\"${project.jaxbApiVersionOsgiRange}\"",
|
||||||
// Temporarily support JTA 1.1 -- Karaf and other frameworks still
|
// // Temporarily support JTA 1.1 -- Karaf and other frameworks still
|
||||||
// use it. Without this, the plugin generates [1.2,2).
|
// // use it. Without this, the plugin generates [1.2,2).
|
||||||
'javax.transaction;version="[1.1,2)"',
|
// 'javax.transaction;version="[1.1,2)"',
|
||||||
// Also import every package referenced in the code
|
// // Also import every package referenced in the code
|
||||||
'*'
|
// '*'
|
||||||
].join( ',' ),
|
// ].join( ',' ),
|
||||||
'-exportcontents': [
|
'-exportcontents': [
|
||||||
// Legacy resource packages containing XSDs that were traditionally not exported
|
// Legacy resource packages containing XSDs that were traditionally not exported
|
||||||
"!org.hibernate.xsd.cfg",
|
"!org.hibernate.xsd.cfg",
|
||||||
|
|
|
@ -377,7 +377,7 @@ public final class CollectionHelper {
|
||||||
@SuppressWarnings( "unchecked" )
|
@SuppressWarnings( "unchecked" )
|
||||||
public static <K,V> void collectMapEntries(BiConsumer<K, V> mapEntryConsumer, Object[] mappings) {
|
public static <K,V> void collectMapEntries(BiConsumer<K, V> mapEntryConsumer, Object[] mappings) {
|
||||||
// even numbered
|
// even numbered
|
||||||
assert mappings.length %2 == 0;
|
assert mappings.length % 2 == 0;
|
||||||
|
|
||||||
for ( int i = 0; i < mappings.length; i += 2 ) {
|
for ( int i = 0; i < mappings.length; i += 2 ) {
|
||||||
mapEntryConsumer.accept( (K) mappings[i], (V) mappings[i+1] );
|
mapEntryConsumer.accept( (K) mappings[i], (V) mappings[i+1] );
|
||||||
|
@ -397,4 +397,59 @@ public final class CollectionHelper {
|
||||||
|
|
||||||
return map;
|
return map;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static Map<String,String> toMap(String... pairs) {
|
||||||
|
assert pairs.length % 2 == 0;
|
||||||
|
if ( pairs.length == 2 ) {
|
||||||
|
return Collections.singletonMap( pairs[0], pairs[1] );
|
||||||
|
}
|
||||||
|
|
||||||
|
final Map<String,String> result = new HashMap<>();
|
||||||
|
applyToMap( result, pairs );
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void applyToMap(Map<String,String> map, String... pairs) {
|
||||||
|
assert pairs.length % 2 == 0;
|
||||||
|
for ( int i = 0; i < pairs.length; i+=2 ) {
|
||||||
|
map.put( pairs[i], pairs[i+1] );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Map<String,?> toMap(Object... pairs) {
|
||||||
|
assert pairs.length % 2 == 0;
|
||||||
|
if ( pairs.length == 2 ) {
|
||||||
|
return Collections.singletonMap( (String) pairs[0], pairs[1] );
|
||||||
|
}
|
||||||
|
|
||||||
|
final Map<String,String> result = new HashMap<>();
|
||||||
|
applyToMap( result, pairs );
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings({ "unchecked", "rawtypes" })
|
||||||
|
private static void applyToMap(Map<String,?> map, Object... pairs) {
|
||||||
|
assert pairs.length % 2 == 0;
|
||||||
|
for ( int i = 0; i < pairs.length; i+=2 ) {
|
||||||
|
( (Map) map ).put( pairs[i], pairs[i+1] );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Properties toProperties(Object... pairs) {
|
||||||
|
final Properties properties = new Properties();
|
||||||
|
if ( pairs.length > 0 ) {
|
||||||
|
assert pairs.length % 2 == 0;
|
||||||
|
for ( int i = 0; i < pairs.length; i+=2 ) {
|
||||||
|
properties.put( pairs[i], pairs[i+1] );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return properties;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void applyToProperties(Properties properties, Object... pairs) {
|
||||||
|
assert pairs.length % 2 == 0;
|
||||||
|
for ( int i = 0; i < pairs.length; i+=2 ) {
|
||||||
|
properties.put( pairs[i], pairs[i+1] );
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -135,6 +135,13 @@ public enum Action {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// lastly, look at the enum name
|
||||||
|
for ( Action action : values() ) {
|
||||||
|
if ( action.name().equals( name ) ) {
|
||||||
|
return action;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
throw new IllegalArgumentException( "Unrecognized JPA schema generation action value : " + value );
|
throw new IllegalArgumentException( "Unrecognized JPA schema generation action value : " + value );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -47,6 +47,7 @@ import static org.hibernate.cfg.AvailableSettings.JAKARTA_HBM2DDL_DROP_SOURCE;
|
||||||
import static org.hibernate.cfg.AvailableSettings.JAKARTA_HBM2DDL_SCRIPTS_ACTION;
|
import static org.hibernate.cfg.AvailableSettings.JAKARTA_HBM2DDL_SCRIPTS_ACTION;
|
||||||
import static org.hibernate.cfg.AvailableSettings.JAKARTA_HBM2DDL_SCRIPTS_CREATE_TARGET;
|
import static org.hibernate.cfg.AvailableSettings.JAKARTA_HBM2DDL_SCRIPTS_CREATE_TARGET;
|
||||||
import static org.hibernate.cfg.AvailableSettings.JAKARTA_HBM2DDL_SCRIPTS_DROP_TARGET;
|
import static org.hibernate.cfg.AvailableSettings.JAKARTA_HBM2DDL_SCRIPTS_DROP_TARGET;
|
||||||
|
import static org.hibernate.internal.log.DeprecationLogger.DEPRECATION_LOGGER;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Responsible for coordinating SchemaManagementTool execution(s) for auto-tooling whether
|
* Responsible for coordinating SchemaManagementTool execution(s) for auto-tooling whether
|
||||||
|
@ -630,71 +631,142 @@ public class SchemaManagementToolCoordinator {
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* For test use
|
* For test use. See {@link #interpret(Metadata, Map)} for the "real" impl
|
||||||
*/
|
*/
|
||||||
@Internal
|
@Internal
|
||||||
public static ActionGrouping interpret(Map configurationValues) {
|
public static ActionGrouping interpret(Map<?,?> configurationValues) {
|
||||||
Object databaseActionSetting = configurationValues.get( HBM2DDL_DATABASE_ACTION );
|
// default to the JPA settings
|
||||||
Object scriptsActionSetting = configurationValues.get( HBM2DDL_SCRIPTS_ACTION );
|
Action databaseAction = determineJpaDbActionSetting( configurationValues );
|
||||||
if ( databaseActionSetting == null ) {
|
Action scriptAction = determineJpaScriptActionSetting( configurationValues );
|
||||||
databaseActionSetting = configurationValues.get( JAKARTA_HBM2DDL_DATABASE_ACTION );
|
|
||||||
}
|
|
||||||
if ( scriptsActionSetting == null ) {
|
|
||||||
scriptsActionSetting = configurationValues.get( JAKARTA_HBM2DDL_SCRIPTS_ACTION );
|
|
||||||
}
|
|
||||||
// interpret the JPA settings first
|
|
||||||
Action databaseAction = Action.interpretJpaSetting( databaseActionSetting );
|
|
||||||
Action scriptAction = Action.interpretJpaSetting( scriptsActionSetting );
|
|
||||||
|
|
||||||
// if no JPA settings were specified, look at the legacy HBM2DDL_AUTO setting...
|
// if no JPA settings were specified, look at the legacy HBM2DDL_AUTO setting...
|
||||||
if ( databaseAction == Action.NONE && scriptAction == Action.NONE ) {
|
if ( databaseAction == null && scriptAction == null ) {
|
||||||
final Action hbm2ddlAutoAction = Action.interpretHbm2ddlSetting( configurationValues.get( HBM2DDL_AUTO ) );
|
final Action autoAction = determineAutoSettingImpliedAction( configurationValues, null, null );
|
||||||
if ( hbm2ddlAutoAction != Action.NONE ) {
|
if ( autoAction != null ) {
|
||||||
databaseAction = hbm2ddlAutoAction;
|
databaseAction = autoAction;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ( databaseAction == null ) {
|
||||||
|
databaseAction = Action.NONE;
|
||||||
|
}
|
||||||
|
if ( scriptAction == null ) {
|
||||||
|
scriptAction = Action.NONE;
|
||||||
|
}
|
||||||
|
|
||||||
return new ActionGrouping( "orm", databaseAction, scriptAction );
|
return new ActionGrouping( "orm", databaseAction, scriptAction );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static Action determineJpaDbActionSetting(Map<?,?> configurationValues) {
|
||||||
|
return determineJpaDbActionSetting( configurationValues, null, null );
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Exposed for tests
|
||||||
|
*/
|
||||||
|
@Internal
|
||||||
|
public static Action determineJpaDbActionSetting(
|
||||||
|
Map<?,?> configurationValues,
|
||||||
|
String contributor,
|
||||||
|
Action defaultValue) {
|
||||||
|
final String jakartaSettingName = contributor == null
|
||||||
|
? JAKARTA_HBM2DDL_DATABASE_ACTION
|
||||||
|
: JAKARTA_HBM2DDL_DATABASE_ACTION + "." + contributor;
|
||||||
|
final String javaxSettingName = contributor == null
|
||||||
|
? HBM2DDL_DATABASE_ACTION
|
||||||
|
: HBM2DDL_DATABASE_ACTION + "." + contributor;
|
||||||
|
|
||||||
|
Object databaseActionSetting = configurationValues.get( jakartaSettingName );
|
||||||
|
if ( databaseActionSetting == null ) {
|
||||||
|
databaseActionSetting = configurationValues.get( javaxSettingName );
|
||||||
|
if ( databaseActionSetting != null ) {
|
||||||
|
DEPRECATION_LOGGER.deprecatedSetting( HBM2DDL_DATABASE_ACTION, JAKARTA_HBM2DDL_DATABASE_ACTION );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return databaseActionSetting == null ? defaultValue : Action.interpretJpaSetting( databaseActionSetting );
|
||||||
|
}
|
||||||
|
|
||||||
|
private static Action determineJpaScriptActionSetting(Map<?,?> configurationValues) {
|
||||||
|
return determineJpaScriptActionSetting( configurationValues, null, null );
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Exposed for tests
|
||||||
|
*/
|
||||||
|
@Internal
|
||||||
|
public static Action determineJpaScriptActionSetting(
|
||||||
|
Map<?,?> configurationValues,
|
||||||
|
String contributor,
|
||||||
|
Action defaultValue) {
|
||||||
|
final String jakartaSettingName = contributor == null
|
||||||
|
? JAKARTA_HBM2DDL_SCRIPTS_ACTION
|
||||||
|
: JAKARTA_HBM2DDL_SCRIPTS_ACTION + "." + contributor;
|
||||||
|
final String javaxSettingName = contributor == null
|
||||||
|
? HBM2DDL_SCRIPTS_ACTION
|
||||||
|
: HBM2DDL_SCRIPTS_ACTION + "." + contributor;
|
||||||
|
|
||||||
|
Object scriptsActionSetting = configurationValues.get( jakartaSettingName );
|
||||||
|
if ( scriptsActionSetting == null ) {
|
||||||
|
scriptsActionSetting = configurationValues.get( javaxSettingName );
|
||||||
|
if ( scriptsActionSetting != null ) {
|
||||||
|
DEPRECATION_LOGGER.deprecatedSetting( HBM2DDL_SCRIPTS_ACTION, JAKARTA_HBM2DDL_SCRIPTS_ACTION );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return scriptsActionSetting == null ? defaultValue : Action.interpretJpaSetting( scriptsActionSetting );
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Action determineAutoSettingImpliedAction(Map<?,?> settings, String contributor, Action defaultValue) {
|
||||||
|
final String settingName = contributor == null
|
||||||
|
? HBM2DDL_AUTO
|
||||||
|
: HBM2DDL_AUTO + "." + contributor;
|
||||||
|
|
||||||
|
final Object scriptsActionSetting = settings.get( settingName );
|
||||||
|
if ( scriptsActionSetting == null ) {
|
||||||
|
return defaultValue;
|
||||||
|
}
|
||||||
|
|
||||||
|
return Action.interpretHbm2ddlSetting( scriptsActionSetting );
|
||||||
|
}
|
||||||
|
|
||||||
public static Set<ActionGrouping> interpret(Metadata metadata, Map<?,?> configurationValues) {
|
public static Set<ActionGrouping> interpret(Metadata metadata, Map<?,?> configurationValues) {
|
||||||
// these represent the base (non-contributor-specific) values
|
// these represent the base (non-contributor-specific) values
|
||||||
final Action rootDatabaseAction = Action.interpretJpaSetting( configurationValues.get( HBM2DDL_DATABASE_ACTION ) );
|
final Action rootDatabaseAction = determineJpaDbActionSetting( configurationValues, null, null );
|
||||||
final Action rootScriptAction = Action.interpretJpaSetting( configurationValues.get( HBM2DDL_SCRIPTS_ACTION ) );
|
final Action rootScriptAction = determineJpaScriptActionSetting( configurationValues, null, null );
|
||||||
final Action rootExportAction = Action.interpretHbm2ddlSetting( configurationValues.get( HBM2DDL_AUTO ) );
|
|
||||||
|
final Action rootAutoAction = determineAutoSettingImpliedAction( configurationValues, null, null );
|
||||||
|
|
||||||
final Set<String> contributors = metadata.getContributors();
|
final Set<String> contributors = metadata.getContributors();
|
||||||
final Set<ActionGrouping> groupings = new HashSet<>( contributors.size() );
|
final Set<ActionGrouping> groupings = new HashSet<>( contributors.size() );
|
||||||
|
|
||||||
// for each contributor, look for specific tooling config values
|
// for each contributor, look for specific tooling config values
|
||||||
for ( String contributor : contributors ) {
|
for ( String contributor : contributors ) {
|
||||||
final Object contributorDatabaseActionSetting = configurationValues.get( HBM2DDL_DATABASE_ACTION + "." + contributor );
|
Action databaseActionToUse = determineJpaDbActionSetting( configurationValues, contributor, rootDatabaseAction );;
|
||||||
final Object contributorScriptActionSetting = configurationValues.get( HBM2DDL_SCRIPTS_ACTION + "." + contributor );
|
Action scriptActionToUse = determineJpaScriptActionSetting( configurationValues, contributor, rootScriptAction );
|
||||||
final Object contributorExportActionSetting = configurationValues.get( HBM2DDL_AUTO + "." + contributor );
|
|
||||||
|
|
||||||
final Action contributorDatabaseAction = contributorDatabaseActionSetting == null
|
if ( databaseActionToUse == null && scriptActionToUse == null ) {
|
||||||
? rootDatabaseAction
|
// no JPA (jakarta nor javax) settings were specified, use the legacy Hibernate
|
||||||
: Action.interpretJpaSetting( contributorDatabaseActionSetting );
|
// `hbm2ddl.auto` setting to possibly set the database-action
|
||||||
final Action contributorScriptAction = contributorScriptActionSetting == null
|
final Action contributorAutoSetting = determineAutoSettingImpliedAction( configurationValues, contributor, rootAutoAction );
|
||||||
? rootScriptAction
|
if ( contributorAutoSetting != null ) {
|
||||||
: Action.interpretJpaSetting( contributorScriptActionSetting );
|
databaseActionToUse = contributorAutoSetting;
|
||||||
final Action contributorExportAction = contributorExportActionSetting == null
|
|
||||||
? rootExportAction
|
|
||||||
: Action.interpretJpaSetting( contributorExportActionSetting );
|
|
||||||
|
|
||||||
Action databaseAction = contributorDatabaseAction;
|
|
||||||
if ( databaseAction == Action.NONE && contributorScriptAction == Action.NONE ) {
|
|
||||||
if ( contributorExportAction != Action.NONE ) {
|
|
||||||
databaseAction = contributorExportAction;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( databaseAction == Action.NONE ) {
|
|
||||||
log.debugf( "No schema actions specified for contributor `%s`; doing nothing", contributor );
|
|
||||||
continue;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
groupings.add( new ActionGrouping( contributor, databaseAction, contributorScriptAction ) );
|
if ( databaseActionToUse == null ) {
|
||||||
|
databaseActionToUse = Action.NONE;
|
||||||
|
}
|
||||||
|
if ( scriptActionToUse == null ) {
|
||||||
|
scriptActionToUse = Action.NONE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( databaseActionToUse == Action.NONE && scriptActionToUse == Action.NONE ) {
|
||||||
|
log.debugf( "No schema actions specified for contributor `%s`; doing nothing", contributor );
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
groupings.add( new ActionGrouping( contributor, databaseActionToUse, scriptActionToUse ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
return groupings;
|
return groupings;
|
||||||
|
|
|
@ -7,14 +7,25 @@
|
||||||
package org.hibernate.orm.test.jpa.ejb3configuration;
|
package org.hibernate.orm.test.jpa.ejb3configuration;
|
||||||
|
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Properties;
|
import java.util.Set;
|
||||||
|
|
||||||
import org.hibernate.HibernateException;
|
import org.hibernate.HibernateException;
|
||||||
|
import org.hibernate.boot.Metadata;
|
||||||
|
import org.hibernate.boot.MetadataSources;
|
||||||
|
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
|
||||||
import org.hibernate.cfg.AvailableSettings;
|
import org.hibernate.cfg.AvailableSettings;
|
||||||
|
import org.hibernate.dialect.Dialect;
|
||||||
|
import org.hibernate.dialect.H2Dialect;
|
||||||
|
import org.hibernate.engine.jdbc.dialect.internal.DialectResolverInitiator;
|
||||||
|
import org.hibernate.engine.jdbc.dialect.spi.DialectResolver;
|
||||||
|
import org.hibernate.internal.util.collections.CollectionHelper;
|
||||||
import org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl;
|
import org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl;
|
||||||
import org.hibernate.jpa.boot.spi.Bootstrap;
|
import org.hibernate.jpa.boot.spi.Bootstrap;
|
||||||
|
import org.hibernate.orm.test.dialect.resolver.TestingDialectResolutionInfo;
|
||||||
|
import org.hibernate.service.spi.ServiceRegistryImplementor;
|
||||||
|
import org.hibernate.tool.schema.Action;
|
||||||
|
import org.hibernate.tool.schema.spi.SchemaManagementToolCoordinator.ActionGrouping;
|
||||||
|
|
||||||
import org.hibernate.testing.orm.jpa.PersistenceUnitInfoAdapter;
|
import org.hibernate.testing.orm.jpa.PersistenceUnitInfoAdapter;
|
||||||
import org.hibernate.testing.orm.junit.BaseUnitTest;
|
import org.hibernate.testing.orm.junit.BaseUnitTest;
|
||||||
|
@ -203,7 +214,7 @@ public class ConfigurationObjectSettingTest {
|
||||||
{
|
{
|
||||||
builder = (EntityManagerFactoryBuilderImpl) Bootstrap.getEntityManagerFactoryBuilder(
|
builder = (EntityManagerFactoryBuilderImpl) Bootstrap.getEntityManagerFactoryBuilder(
|
||||||
empty,
|
empty,
|
||||||
toMap(
|
CollectionHelper.toMap(
|
||||||
jdbcUrl, urlValue,
|
jdbcUrl, urlValue,
|
||||||
jdbcDriver, driverValue,
|
jdbcDriver, driverValue,
|
||||||
jdbcUser, userValue,
|
jdbcUser, userValue,
|
||||||
|
@ -221,7 +232,7 @@ public class ConfigurationObjectSettingTest {
|
||||||
}
|
}
|
||||||
|
|
||||||
PersistenceUnitInfoAdapter pui = new PersistenceUnitInfoAdapter();
|
PersistenceUnitInfoAdapter pui = new PersistenceUnitInfoAdapter();
|
||||||
applyToMap(
|
CollectionHelper.applyToProperties(
|
||||||
pui.getProperties(),
|
pui.getProperties(),
|
||||||
jdbcUrl, urlValue,
|
jdbcUrl, urlValue,
|
||||||
jdbcDriver, driverValue,
|
jdbcDriver, driverValue,
|
||||||
|
@ -242,34 +253,67 @@ public class ConfigurationObjectSettingTest {
|
||||||
|
|
||||||
builder.cancel();
|
builder.cancel();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private static Map<String,String> toMap(String... pairs) {
|
@Test
|
||||||
assert pairs.length %2 == 0;
|
public void testSchemaGenSettings() {
|
||||||
if ( pairs.length == 2 ) {
|
verifySchemaGenSettings(
|
||||||
return Collections.singletonMap( pairs[0], pairs[1] );
|
AvailableSettings.JAKARTA_HBM2DDL_DATABASE_ACTION,
|
||||||
}
|
AvailableSettings.JAKARTA_HBM2DDL_SCRIPTS_ACTION,
|
||||||
|
AvailableSettings.JAKARTA_HBM2DDL_CREATE_SCHEMAS,
|
||||||
final Map<String,String> result = new HashMap<>();
|
AvailableSettings.JAKARTA_HBM2DDL_DB_NAME
|
||||||
for ( int i = 0; i < pairs.length; i+=2 ) {
|
);
|
||||||
result.put( pairs[i], pairs[i+1] );
|
verifySchemaGenSettings(
|
||||||
}
|
AvailableSettings.HBM2DDL_DATABASE_ACTION,
|
||||||
return result;
|
AvailableSettings.HBM2DDL_SCRIPTS_ACTION,
|
||||||
|
AvailableSettings.HBM2DDL_CREATE_SCHEMAS,
|
||||||
|
AvailableSettings.DIALECT_DB_NAME
|
||||||
|
);
|
||||||
|
// verifySchemaGenSettingsPrecedence();
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void applyToMap(Map<String,String> map, String... pairs) {
|
private void verifySchemaGenSettings(
|
||||||
assert pairs.length %2 == 0;
|
String dbActionSettingName,
|
||||||
for ( int i = 0; i < pairs.length; i+=2 ) {
|
String scriptActionSettingName,
|
||||||
map.put( pairs[i], pairs[i+1] );
|
String createSchemasSettingName,
|
||||||
}
|
String dbNameSettingName) {
|
||||||
|
final Action dbAction = Action.CREATE_ONLY;
|
||||||
|
final Action scriptAction = Action.CREATE_ONLY;
|
||||||
|
final boolean createSchemas = true;
|
||||||
|
final String dbName = "H2";
|
||||||
|
|
||||||
|
final Map<String, String> settings = CollectionHelper.toMap(
|
||||||
|
dbActionSettingName, dbAction.getExternalJpaName(),
|
||||||
|
scriptActionSettingName, scriptAction.getExternalJpaName(),
|
||||||
|
createSchemasSettingName, Boolean.toString( createSchemas ),
|
||||||
|
dbNameSettingName, dbName
|
||||||
|
);
|
||||||
|
|
||||||
|
// first verify the individual interpretations
|
||||||
|
final Action interpretedDbAction = ActionGrouping.determineJpaDbActionSetting( settings, null, null );
|
||||||
|
assertThat( interpretedDbAction ).isEqualTo( dbAction );
|
||||||
|
final Action interpretedScriptAction = ActionGrouping.determineJpaScriptActionSetting( settings, null, null );
|
||||||
|
assertThat( interpretedScriptAction ).isEqualTo( scriptAction );
|
||||||
|
|
||||||
|
// next verify the action-group determination
|
||||||
|
final ActionGrouping actionGrouping = ActionGrouping.interpret( settings );
|
||||||
|
assertThat( actionGrouping.getDatabaseAction() ).isEqualTo( dbAction );
|
||||||
|
assertThat( actionGrouping.getScriptAction() ).isEqualTo( scriptAction );
|
||||||
|
|
||||||
|
// the check above uses a "for testing only" form of what happens for "real".
|
||||||
|
// verify the "real" path as well
|
||||||
|
final Metadata metadata = new MetadataSources().addAnnotatedClass( Bell.class ).buildMetadata();
|
||||||
|
final Set<ActionGrouping> actionGroupings = ActionGrouping.interpret( metadata, settings );
|
||||||
|
assertThat( actionGroupings ).hasSize( 1 );
|
||||||
|
final ActionGrouping grouping = actionGroupings.iterator().next();
|
||||||
|
assertThat( grouping.getContributor() ).isEqualTo( "orm" );
|
||||||
|
assertThat( grouping.getDatabaseAction() ).isEqualTo( dbAction );
|
||||||
|
assertThat( grouping.getScriptAction() ).isEqualTo( scriptAction );
|
||||||
|
|
||||||
|
// verify also interpreting the db-name, etc... they are used by SF/EMF to resolve Dialect
|
||||||
|
final DialectResolver dialectResolver = new DialectResolverInitiator().initiateService( settings, (ServiceRegistryImplementor) new StandardServiceRegistryBuilder().build() );
|
||||||
|
final Dialect dialect = dialectResolver.resolveDialect( TestingDialectResolutionInfo.forDatabaseInfo( dbName ) );
|
||||||
|
assertThat( dialect ).isInstanceOf( H2Dialect.class );
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void applyToMap(Properties map, String... pairs) {
|
|
||||||
assert pairs.length %2 == 0;
|
|
||||||
for ( int i = 0; i < pairs.length; i+=2 ) {
|
|
||||||
map.put( pairs[i], pairs[i+1] );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,38 @@
|
||||||
|
/*
|
||||||
|
* Hibernate, Relational Persistence for Idiomatic Java
|
||||||
|
*
|
||||||
|
* License: GNU Lesser General Public License (LGPL), version 2.1 or later
|
||||||
|
* See the lgpl.txt file in the root directory or http://www.gnu.org/licenses/lgpl-2.1.html
|
||||||
|
*/
|
||||||
|
package org.hibernate.orm.test.jpa.jakarta;
|
||||||
|
|
||||||
|
import org.hibernate.cfg.AvailableSettings;
|
||||||
|
|
||||||
|
import org.hibernate.testing.orm.junit.DomainModel;
|
||||||
|
import org.hibernate.testing.orm.junit.ServiceRegistry;
|
||||||
|
import org.hibernate.testing.orm.junit.SessionFactory;
|
||||||
|
import org.hibernate.testing.orm.junit.SessionFactoryScope;
|
||||||
|
import org.hibernate.testing.orm.junit.Setting;
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Make sure {@code `jakarta.persistence.*`} settings have function precedence over
|
||||||
|
* the legacy {@link `javax.persistence.*`} counterparts
|
||||||
|
*
|
||||||
|
* @author Steve Ebersole
|
||||||
|
*/
|
||||||
|
@ServiceRegistry(
|
||||||
|
settings = {
|
||||||
|
@Setting( name = AvailableSettings.JAKARTA_HBM2DDL_DATABASE_ACTION, value = "create-drop" ),
|
||||||
|
@Setting( name = AvailableSettings.HBM2DDL_DATABASE_ACTION, value = "none" )
|
||||||
|
}
|
||||||
|
)
|
||||||
|
@DomainModel( annotatedClasses = SimpleEntity.class )
|
||||||
|
@SessionFactory
|
||||||
|
public class JakartaSchemaToolingSettingPrecedenceTests {
|
||||||
|
@Test
|
||||||
|
public void verifySchemaCreated(SessionFactoryScope scope) {
|
||||||
|
// the query would fail if the schema were not exported - just a smoke test
|
||||||
|
scope.inTransaction( (s) -> s.createQuery( "from SimpleEntity" ).list() );
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,125 @@
|
||||||
|
/*
|
||||||
|
* Hibernate, Relational Persistence for Idiomatic Java
|
||||||
|
*
|
||||||
|
* License: GNU Lesser General Public License (LGPL), version 2.1 or later
|
||||||
|
* See the lgpl.txt file in the root directory or http://www.gnu.org/licenses/lgpl-2.1.html
|
||||||
|
*/
|
||||||
|
package org.hibernate.orm.test.jpa.jakarta;
|
||||||
|
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Properties;
|
||||||
|
|
||||||
|
import org.hibernate.cfg.AvailableSettings;
|
||||||
|
import org.hibernate.cfg.Environment;
|
||||||
|
import org.hibernate.engine.spi.SessionFactoryImplementor;
|
||||||
|
import org.hibernate.internal.util.collections.CollectionHelper;
|
||||||
|
import org.hibernate.jpa.boot.spi.Bootstrap;
|
||||||
|
import org.hibernate.jpa.boot.spi.EntityManagerFactoryBuilder;
|
||||||
|
import org.hibernate.tool.schema.Action;
|
||||||
|
|
||||||
|
import org.hibernate.testing.orm.jpa.PersistenceUnitDescriptorAdapter;
|
||||||
|
import org.hibernate.testing.orm.junit.DomainModel;
|
||||||
|
import org.hibernate.testing.orm.junit.ServiceRegistry;
|
||||||
|
import org.hibernate.testing.orm.junit.SessionFactory;
|
||||||
|
import org.hibernate.testing.orm.junit.Setting;
|
||||||
|
import org.hibernate.testing.transaction.TransactionUtil2;
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
|
||||||
|
import static org.hibernate.cfg.AvailableSettings.HBM2DDL_DATABASE_ACTION;
|
||||||
|
import static org.hibernate.cfg.AvailableSettings.JAKARTA_HBM2DDL_DATABASE_ACTION;
|
||||||
|
import static org.hibernate.cfg.AvailableSettings.JAKARTA_JPA_JDBC_DRIVER;
|
||||||
|
import static org.hibernate.cfg.AvailableSettings.JAKARTA_JPA_JDBC_PASSWORD;
|
||||||
|
import static org.hibernate.cfg.AvailableSettings.JAKARTA_JPA_JDBC_URL;
|
||||||
|
import static org.hibernate.cfg.AvailableSettings.JAKARTA_JPA_JDBC_USER;
|
||||||
|
import static org.hibernate.cfg.AvailableSettings.JPA_JDBC_DRIVER;
|
||||||
|
import static org.hibernate.cfg.AvailableSettings.JPA_JDBC_PASSWORD;
|
||||||
|
import static org.hibernate.cfg.AvailableSettings.JPA_JDBC_URL;
|
||||||
|
import static org.hibernate.cfg.AvailableSettings.JPA_JDBC_USER;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Steve Ebersole
|
||||||
|
*/
|
||||||
|
@ServiceRegistry(
|
||||||
|
settings = {
|
||||||
|
@Setting( name = JAKARTA_HBM2DDL_DATABASE_ACTION, value = "create-drop" )
|
||||||
|
}
|
||||||
|
)
|
||||||
|
@DomainModel( annotatedClasses = SimpleEntity.class )
|
||||||
|
@SessionFactory
|
||||||
|
public class JakartaSchemaToolingTests {
|
||||||
|
@Test
|
||||||
|
public void testSchemaCreation() {
|
||||||
|
verifySchemaCreation( JAKARTA_HBM2DDL_DATABASE_ACTION, JAKARTA_JPA_JDBC_DRIVER, JAKARTA_JPA_JDBC_URL, JAKARTA_JPA_JDBC_USER, JAKARTA_JPA_JDBC_PASSWORD );
|
||||||
|
verifySchemaCreation( HBM2DDL_DATABASE_ACTION, JPA_JDBC_DRIVER, JPA_JDBC_URL, JPA_JDBC_USER, JPA_JDBC_PASSWORD );
|
||||||
|
}
|
||||||
|
|
||||||
|
private void verifySchemaCreation(
|
||||||
|
String actionSettingName,
|
||||||
|
String driverSettingName,
|
||||||
|
String urlSettingName,
|
||||||
|
String userSettingName,
|
||||||
|
String passwordSettingName) {
|
||||||
|
final SessionFactoryImplementor sessionFactory = buildSessionFactory(
|
||||||
|
actionSettingName, Action.CREATE_DROP,
|
||||||
|
driverSettingName, Environment.getProperties().get( AvailableSettings.DRIVER ),
|
||||||
|
urlSettingName, Environment.getProperties().get( AvailableSettings.URL ),
|
||||||
|
userSettingName, Environment.getProperties().get( AvailableSettings.USER ),
|
||||||
|
passwordSettingName, Environment.getProperties().get( AvailableSettings.PASS )
|
||||||
|
);
|
||||||
|
try {
|
||||||
|
tryQuery( sessionFactory );
|
||||||
|
}
|
||||||
|
finally {
|
||||||
|
sessionFactory.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private void tryQuery(SessionFactoryImplementor sessionFactory) {
|
||||||
|
TransactionUtil2.inTransaction( sessionFactory, (session) -> {
|
||||||
|
// the query would fail if the schema were not exported - just a smoke test
|
||||||
|
session.createQuery( "from SimpleEntity" ).list();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testPrecedence() {
|
||||||
|
// make sure JAKARTA_HBM2DDL_DATABASE_ACTION (`jakarta...`) takes precedence over HBM2DDL_DATABASE_ACTION (`javax...`)
|
||||||
|
try ( SessionFactoryImplementor sessionFactory = buildSessionFactory(
|
||||||
|
JAKARTA_HBM2DDL_DATABASE_ACTION, Action.CREATE_DROP,
|
||||||
|
HBM2DDL_DATABASE_ACTION, Action.NONE,
|
||||||
|
JAKARTA_JPA_JDBC_DRIVER, Environment.getProperties().get( AvailableSettings.DRIVER ),
|
||||||
|
JAKARTA_JPA_JDBC_URL, Environment.getProperties().get( AvailableSettings.URL ),
|
||||||
|
JAKARTA_JPA_JDBC_USER, Environment.getProperties().get( AvailableSettings.USER ),
|
||||||
|
JAKARTA_JPA_JDBC_PASSWORD, Environment.getProperties().get( AvailableSettings.PASS )
|
||||||
|
) ) {
|
||||||
|
tryQuery( sessionFactory );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private SessionFactoryImplementor buildSessionFactory(Object... settingPairs) {
|
||||||
|
final Properties settings = CollectionHelper.toProperties( settingPairs );
|
||||||
|
|
||||||
|
final PersistenceUnitDescriptorAdapter puDescriptor = new PersistenceUnitDescriptorAdapter() {
|
||||||
|
@Override
|
||||||
|
public Properties getProperties() {
|
||||||
|
return settings;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<String> getManagedClassNames() {
|
||||||
|
return Collections.singletonList( SimpleEntity.class.getName() );
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
final EntityManagerFactoryBuilder emfBuilder = Bootstrap.getEntityManagerFactoryBuilder(
|
||||||
|
puDescriptor,
|
||||||
|
settings,
|
||||||
|
(mergedSettings) -> mergedSettings.getConfigurationValues().clear()
|
||||||
|
);
|
||||||
|
|
||||||
|
return emfBuilder.build().unwrap( SessionFactoryImplementor.class );
|
||||||
|
}
|
||||||
|
}
|
|
@ -4,7 +4,7 @@
|
||||||
* License: GNU Lesser General Public License (LGPL), version 2.1 or later
|
* License: GNU Lesser General Public License (LGPL), version 2.1 or later
|
||||||
* See the lgpl.txt file in the root directory or http://www.gnu.org/licenses/lgpl-2.1.html
|
* See the lgpl.txt file in the root directory or http://www.gnu.org/licenses/lgpl-2.1.html
|
||||||
*/
|
*/
|
||||||
package org.hibernate.orm.test.jpa.xml;
|
package org.hibernate.orm.test.jpa.jakarta;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
|
@ -0,0 +1,24 @@
|
||||||
|
/*
|
||||||
|
* Hibernate, Relational Persistence for Idiomatic Java
|
||||||
|
*
|
||||||
|
* License: GNU Lesser General Public License (LGPL), version 2.1 or later
|
||||||
|
* See the lgpl.txt file in the root directory or http://www.gnu.org/licenses/lgpl-2.1.html
|
||||||
|
*/
|
||||||
|
package org.hibernate.orm.test.jpa.jakarta;
|
||||||
|
|
||||||
|
import jakarta.persistence.Basic;
|
||||||
|
import jakarta.persistence.Entity;
|
||||||
|
import jakarta.persistence.Id;
|
||||||
|
import jakarta.persistence.Table;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Steve Ebersole
|
||||||
|
*/
|
||||||
|
@Entity(name = "SimpleEntity")
|
||||||
|
@Table(name = "SimpleEntity")
|
||||||
|
public class SimpleEntity {
|
||||||
|
@Id
|
||||||
|
public Integer id;
|
||||||
|
@Basic
|
||||||
|
public String name;
|
||||||
|
}
|
|
@ -0,0 +1,13 @@
|
||||||
|
/*
|
||||||
|
* Hibernate, Relational Persistence for Idiomatic Java
|
||||||
|
*
|
||||||
|
* License: GNU Lesser General Public License (LGPL), version 2.1 or later
|
||||||
|
* See the lgpl.txt file in the root directory or http://www.gnu.org/licenses/lgpl-2.1.html
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Initial tests for functional Jakarta Persistence support;
|
||||||
|
*
|
||||||
|
* @author Steve Ebersole
|
||||||
|
*/
|
||||||
|
package org.hibernate.orm.test.jpa.jakarta;
|
Loading…
Reference in New Issue