Skip to content

Commit 9b9b806

Browse files
committed
HHH-10018 - Change default ImplicitNamingStrategy to use the JPA compliant one + ImplicitNamingStrategy short-naming
1 parent 1556c27 commit 9b9b806

File tree

7 files changed

+141
-18
lines changed

7 files changed

+141
-18
lines changed

hibernate-core/src/main/java/org/hibernate/boot/internal/MetadataBuilderImpl.java

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
import java.util.HashMap;
1313
import java.util.List;
1414
import java.util.Map;
15+
import java.util.concurrent.Callable;
1516
import javax.persistence.AttributeConverter;
1617
import javax.persistence.SharedCacheMode;
1718

@@ -39,6 +40,7 @@
3940
import org.hibernate.boot.model.TypeContributions;
4041
import org.hibernate.boot.model.TypeContributor;
4142
import org.hibernate.boot.model.naming.ImplicitNamingStrategy;
43+
import org.hibernate.boot.model.naming.ImplicitNamingStrategyJpaCompliantImpl;
4244
import org.hibernate.boot.model.naming.ImplicitNamingStrategyLegacyJpaImpl;
4345
import org.hibernate.boot.model.naming.PhysicalNamingStrategy;
4446
import org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl;
@@ -672,7 +674,16 @@ public AccessType convert(Object value) {
672674
implicitNamingStrategy = strategySelector.resolveDefaultableStrategy(
673675
ImplicitNamingStrategy.class,
674676
configService.getSettings().get( AvailableSettings.IMPLICIT_NAMING_STRATEGY ),
675-
ImplicitNamingStrategyLegacyJpaImpl.INSTANCE
677+
new Callable<ImplicitNamingStrategy>() {
678+
@Override
679+
public ImplicitNamingStrategy call() throws Exception {
680+
return strategySelector.resolveDefaultableStrategy(
681+
ImplicitNamingStrategy.class,
682+
"default",
683+
ImplicitNamingStrategyJpaCompliantImpl.INSTANCE
684+
);
685+
}
686+
}
676687
);
677688

678689
physicalNamingStrategy = strategySelector.resolveDefaultableStrategy(

hibernate-core/src/main/java/org/hibernate/boot/registry/selector/internal/StrategySelectorBuilder.java

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,11 @@
99
import java.util.ArrayList;
1010
import java.util.List;
1111

12+
import org.hibernate.boot.model.naming.ImplicitNamingStrategy;
13+
import org.hibernate.boot.model.naming.ImplicitNamingStrategyComponentPathImpl;
14+
import org.hibernate.boot.model.naming.ImplicitNamingStrategyJpaCompliantImpl;
15+
import org.hibernate.boot.model.naming.ImplicitNamingStrategyLegacyHbmImpl;
16+
import org.hibernate.boot.model.naming.ImplicitNamingStrategyLegacyJpaImpl;
1217
import org.hibernate.boot.registry.classloading.spi.ClassLoaderService;
1318
import org.hibernate.boot.registry.selector.SimpleStrategyRegistrationImpl;
1419
import org.hibernate.boot.registry.selector.StrategyRegistration;
@@ -151,6 +156,7 @@ public StrategySelector buildSelector(ClassLoaderService classLoaderService) {
151156
addTransactionCoordinatorBuilders( strategySelector );
152157
addMultiTableBulkIdStrategies( strategySelector );
153158
addEntityCopyObserverStrategies( strategySelector );
159+
addImplicitNamingStrategies( strategySelector );
154160

155161
// apply auto-discovered registrations
156162
for ( StrategyRegistrationProvider provider : classLoaderService.loadJavaServices( StrategyRegistrationProvider.class ) ) {
@@ -385,4 +391,32 @@ private void addEntityCopyObserverStrategies(StrategySelectorImpl strategySelect
385391
EntityCopyAllowedLoggedObserver.class
386392
);
387393
}
394+
395+
private void addImplicitNamingStrategies(StrategySelectorImpl strategySelector) {
396+
strategySelector.registerStrategyImplementor(
397+
ImplicitNamingStrategy.class,
398+
"default",
399+
ImplicitNamingStrategyJpaCompliantImpl.class
400+
);
401+
strategySelector.registerStrategyImplementor(
402+
ImplicitNamingStrategy.class,
403+
"jpa",
404+
ImplicitNamingStrategyJpaCompliantImpl.class
405+
);
406+
strategySelector.registerStrategyImplementor(
407+
ImplicitNamingStrategy.class,
408+
"legacy-jpa",
409+
ImplicitNamingStrategyLegacyJpaImpl.class
410+
);
411+
strategySelector.registerStrategyImplementor(
412+
ImplicitNamingStrategy.class,
413+
"legacy-hbm",
414+
ImplicitNamingStrategyLegacyHbmImpl.class
415+
);
416+
strategySelector.registerStrategyImplementor(
417+
ImplicitNamingStrategy.class,
418+
"component-path",
419+
ImplicitNamingStrategyComponentPathImpl.class
420+
);
421+
}
388422
}

hibernate-core/src/main/java/org/hibernate/boot/registry/selector/internal/StrategySelectorImpl.java

Lines changed: 27 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88

99
import java.util.Iterator;
1010
import java.util.Map;
11+
import java.util.concurrent.Callable;
1112
import java.util.concurrent.ConcurrentHashMap;
1213

1314
import org.hibernate.boot.registry.classloading.spi.ClassLoaderService;
@@ -116,14 +117,37 @@ public <T> Class<? extends T> selectStrategyImplementor(Class<T> strategy, Strin
116117

117118
@Override
118119
public <T> T resolveStrategy(Class<T> strategy, Object strategyReference) {
119-
return resolveDefaultableStrategy( strategy, strategyReference, null );
120+
return resolveDefaultableStrategy( strategy, strategyReference, (T) null );
120121
}
121122

122123
@Override
123124
@SuppressWarnings("unchecked")
124-
public <T> T resolveDefaultableStrategy(Class<T> strategy, Object strategyReference, T defaultValue) {
125+
public <T> T resolveDefaultableStrategy(Class<T> strategy, Object strategyReference, final T defaultValue) {
126+
return resolveDefaultableStrategy(
127+
strategy,
128+
strategyReference,
129+
new Callable<T>() {
130+
@Override
131+
public T call() {
132+
return defaultValue;
133+
}
134+
}
135+
);
136+
}
137+
138+
@Override
139+
@SuppressWarnings("unchecked")
140+
public <T> T resolveDefaultableStrategy(
141+
Class<T> strategy,
142+
Object strategyReference,
143+
Callable<T> defaultResolver) {
125144
if ( strategyReference == null ) {
126-
return defaultValue;
145+
try {
146+
return defaultResolver.call();
147+
}
148+
catch (Exception e) {
149+
throw new StrategySelectionException( "Default-resolver threw exception", e );
150+
}
127151
}
128152

129153
if ( strategy.isInstance( strategyReference ) ) {

hibernate-core/src/main/java/org/hibernate/boot/registry/selector/spi/StrategySelector.java

Lines changed: 35 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66
*/
77
package org.hibernate.boot.registry.selector.spi;
88

9+
import java.util.concurrent.Callable;
10+
911
import org.hibernate.service.Service;
1012

1113
/**
@@ -40,7 +42,7 @@ public interface StrategySelector extends Service {
4042
* @param <T> The type of the strategy. Used to make sure that the strategy and implementation are type
4143
* compatible.
4244
*/
43-
public <T> void registerStrategyImplementor(Class<T> strategy, String name, Class<? extends T> implementation);
45+
<T> void registerStrategyImplementor(Class<T> strategy, String name, Class<? extends T> implementation);
4446

4547
/**
4648
* Un-registers a named implementor of a particular strategy contract. Un-registers all named registrations
@@ -51,7 +53,7 @@ public interface StrategySelector extends Service {
5153
* @param <T> The type of the strategy. Used to make sure that the strategy and implementation are type
5254
* compatible.
5355
*/
54-
public <T> void unRegisterStrategyImplementor(Class<T> strategy, Class<? extends T> implementation);
56+
<T> void unRegisterStrategyImplementor(Class<T> strategy, Class<? extends T> implementation);
5557

5658
/**
5759
* Locate the named strategy implementation.
@@ -63,7 +65,7 @@ public interface StrategySelector extends Service {
6365
*
6466
* @return The named strategy implementation class.
6567
*/
66-
public <T> Class<? extends T> selectStrategyImplementor(Class<T> strategy, String name);
68+
<T> Class<? extends T> selectStrategyImplementor(Class<T> strategy, String name);
6769

6870
/**
6971
* Resolve strategy instances. See discussion on {@link #resolveDefaultableStrategy}.
@@ -76,7 +78,7 @@ public interface StrategySelector extends Service {
7678
*
7779
* @return The strategy instance
7880
*/
79-
public <T> T resolveStrategy(Class<T> strategy, Object strategyReference);
81+
<T> T resolveStrategy(Class<T> strategy, Object strategyReference);
8082

8183
/**
8284
* Resolve strategy instances. The incoming reference might be:<ul>
@@ -104,5 +106,33 @@ public interface StrategySelector extends Service {
104106
*
105107
* @return The strategy instance
106108
*/
107-
public <T> T resolveDefaultableStrategy(Class<T> strategy, Object strategyReference, T defaultValue);
109+
<T> T resolveDefaultableStrategy(Class<T> strategy, Object strategyReference, T defaultValue);
110+
111+
/**
112+
* Resolve strategy instances. The incoming reference might be:<ul>
113+
* <li>
114+
* {@code null} - in which case defaultValue is returned.
115+
* </li>
116+
* <li>
117+
* An actual instance of the strategy type - it is returned, as is
118+
* </li>
119+
* <li>
120+
* A reference to the implementation {@link Class} - an instance is created by calling
121+
* {@link Class#newInstance()} (aka, the class's no-arg ctor).
122+
* </li>
123+
* <li>
124+
* The name of the implementation class - First the implementation's {@link Class} reference
125+
* is resolved, and then an instance is created by calling {@link Class#newInstance()}
126+
* </li>
127+
* </ul>
128+
*
129+
* @param strategy The type (interface) of the strategy to be resolved.
130+
* @param strategyReference The reference to the strategy for which we need to resolve an instance.
131+
* @param defaultResolver A strategy for resolving the default value strategyReference resolves to null.
132+
* @param <T> The type of the strategy. Used to make sure that the strategy and implementation are type
133+
* compatible.
134+
*
135+
* @return The strategy instance
136+
*/
137+
<T> T resolveDefaultableStrategy(Class<T> strategy, Object strategyReference, Callable<T> defaultResolver);
108138
}

hibernate-core/src/main/java/org/hibernate/cfg/AvailableSettings.java

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -358,7 +358,17 @@ public interface AvailableSettings {
358358
String SCANNER_DISCOVERY = "hibernate.archive.autodetection";
359359

360360
/**
361-
* Used to specify the {@link org.hibernate.boot.model.naming.ImplicitNamingStrategy} class to use.
361+
* Used to specify the {@link org.hibernate.boot.model.naming.ImplicitNamingStrategy} class to use. The following
362+
* short-names are defined for this setting:<ul>
363+
* <li>"default" -> {@link org.hibernate.boot.model.naming.ImplicitNamingStrategyJpaCompliantImpl}</li>
364+
* <li>"jpa" -> {@link org.hibernate.boot.model.naming.ImplicitNamingStrategyJpaCompliantImpl}</li>
365+
* <li>"legacy-jpa" -> {@link org.hibernate.boot.model.naming.ImplicitNamingStrategyLegacyJpaImpl}</li>
366+
* <li>"legacy-hbm" -> {@link org.hibernate.boot.model.naming.ImplicitNamingStrategyLegacyHbmImpl}</li>
367+
* <li>"component-path" -> {@link org.hibernate.boot.model.naming.ImplicitNamingStrategyComponentPathImpl}</li>
368+
* </ul>
369+
*
370+
* The default is defined by the ImplicitNamingStrategy registered under the "default" key. If that happens to
371+
* be empty, the fallback is to use {@link org.hibernate.boot.model.naming.ImplicitNamingStrategyJpaCompliantImpl}.
362372
*
363373
* @see MetadataBuilder#applyImplicitNamingStrategy
364374
*

hibernate-core/src/test/java/org/hibernate/test/schematoolsnaming/StandaloneSchemaToolsNamingTest.java

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -29,38 +29,50 @@
2929
@TestForIssue( jiraKey = "HHH-9467" )
3030
public class StandaloneSchemaToolsNamingTest extends BaseUnitTestCase {
3131
@Test
32-
public void testDefaultNamingStrategy() throws Exception {
32+
public void testDefaultImplicitNamingStrategy() throws Exception {
3333
checkNamingStrategies(
3434
new String[] {
3535
"--text",
3636
"--config=org/hibernate/test/schematoolsnaming/hibernate.cfg.xml"
3737
},
38-
ImplicitNamingStrategyLegacyJpaImpl.class
38+
ImplicitNamingStrategyJpaCompliantImpl.class
3939
);
4040
}
4141

4242
@Test
43-
public void testDeprecatedNamingStrategy() throws Exception {
43+
public void testDeprecatedNamingSetting() throws Exception {
4444
// output should be the same as above test, --naming should simply produce a logged warning
4545
checkNamingStrategies(
4646
new String[] {
4747
"--text",
4848
"--config=org/hibernate/test/schematoolsnaming/hibernate.cfg.xml",
4949
"--naming=DoesNotExist",
5050
},
51+
ImplicitNamingStrategyJpaCompliantImpl.class
52+
);
53+
}
54+
55+
@Test
56+
public void testImplicitNamingStrategySettingFullName() throws Exception {
57+
checkNamingStrategies(
58+
new String[] {
59+
"--text",
60+
"--config=org/hibernate/test/schematoolsnaming/hibernate.cfg.xml",
61+
"--implicit-naming=" + ImplicitNamingStrategyLegacyJpaImpl.class.getName(),
62+
},
5163
ImplicitNamingStrategyLegacyJpaImpl.class
5264
);
5365
}
5466

5567
@Test
56-
public void testJpaCompliantNamingStrategy() throws Exception {
68+
public void testImplicitNamingStrategySettingShortName() throws Exception {
5769
checkNamingStrategies(
5870
new String[] {
5971
"--text",
6072
"--config=org/hibernate/test/schematoolsnaming/hibernate.cfg.xml",
61-
"--implicit-naming=" + ImplicitNamingStrategyJpaCompliantImpl.class.getName(),
73+
"--implicit-naming=legacy-jpa",
6274
},
63-
ImplicitNamingStrategyJpaCompliantImpl.class
75+
ImplicitNamingStrategyLegacyJpaImpl.class
6476
);
6577
}
6678

working-5.0-migration-guide.md

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,9 @@ Working list of changes for 5.0
3939
the configuration must explicitly state that using either the `useNamed` (true) setting or by specifying the `type`
4040
setting set to the value 12 (VARCHAR JDBC type code).
4141
* Default value for `hibernate.id.new_generator_mappings` setting changed to true for 5.0. See
42-
`org.hibernate.cfg.AvailableSettings#USE_NEW_ID_GENERATOR_MAPPINGS` javadocs.
42+
`org.hibernate.cfg.AvailableSettings#USE_NEW_ID_GENERATOR_MAPPINGS` javadocs.
43+
* The default ImplicitNamingStrategy (`hibernate.implicit_naming_strategy`) has changed to the JPA-compliant one. See
44+
`org.hibernate.cfg.AvailableSettings.IMPLICIT_NAMING_STRATEGY` javadocs for details.
4345

4446

4547
TODOs
@@ -67,7 +69,7 @@ Blog items
6769
* integrated with hibernate-envers
6870
* collection values, map keys
6971
* scanning support for non-JPA usage
70-
* naming strategy
72+
* naming strategy split. default is now to be jpa-compliant
7173
* OSGi improvements, Karaf feature file published
7274

7375

0 commit comments

Comments
 (0)