Skip to content

Commit 9e963bc

Browse files
committed
Add Hibernate runtime hints
This adds hints for the two No JtaPlatform candidates as well as for the naming strategies. Closes gh-35423
1 parent 0c071b6 commit 9e963bc

File tree

2 files changed

+60
-0
lines changed

2 files changed

+60
-0
lines changed

spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaConfiguration.java

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,20 +28,29 @@
2828

2929
import org.apache.commons.logging.Log;
3030
import org.apache.commons.logging.LogFactory;
31+
import org.hibernate.boot.model.naming.CamelCaseToUnderscoresNamingStrategy;
3132
import org.hibernate.boot.model.naming.ImplicitNamingStrategy;
3233
import org.hibernate.boot.model.naming.PhysicalNamingStrategy;
3334
import org.hibernate.cfg.AvailableSettings;
3435

36+
import org.springframework.aot.hint.MemberCategory;
37+
import org.springframework.aot.hint.RuntimeHints;
38+
import org.springframework.aot.hint.RuntimeHintsRegistrar;
39+
import org.springframework.aot.hint.TypeHint;
40+
import org.springframework.aot.hint.TypeReference;
3541
import org.springframework.beans.factory.ObjectProvider;
3642
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
3743
import org.springframework.boot.autoconfigure.condition.ConditionalOnSingleCandidate;
44+
import org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaConfiguration.HibernateRuntimeHints;
3845
import org.springframework.boot.context.properties.EnableConfigurationProperties;
3946
import org.springframework.boot.jdbc.SchemaManagementProvider;
4047
import org.springframework.boot.jdbc.metadata.CompositeDataSourcePoolMetadataProvider;
4148
import org.springframework.boot.jdbc.metadata.DataSourcePoolMetadata;
4249
import org.springframework.boot.jdbc.metadata.DataSourcePoolMetadataProvider;
50+
import org.springframework.boot.orm.jpa.hibernate.SpringImplicitNamingStrategy;
4351
import org.springframework.boot.orm.jpa.hibernate.SpringJtaPlatform;
4452
import org.springframework.context.annotation.Configuration;
53+
import org.springframework.context.annotation.ImportRuntimeHints;
4554
import org.springframework.jndi.JndiLocatorDelegate;
4655
import org.springframework.orm.hibernate5.SpringBeanContainer;
4756
import org.springframework.orm.jpa.vendor.AbstractJpaVendorAdapter;
@@ -57,10 +66,12 @@
5766
* @author Manuel Doninger
5867
* @author Andy Wilkinson
5968
* @author Stephane Nicoll
69+
* @author Moritz Halbritter
6070
*/
6171
@Configuration(proxyBeanMethods = false)
6272
@EnableConfigurationProperties(HibernateProperties.class)
6373
@ConditionalOnSingleCandidate(DataSource.class)
74+
@ImportRuntimeHints(HibernateRuntimeHints.class)
6475
class HibernateJpaConfiguration extends JpaBaseConfiguration {
6576

6677
private static final Log logger = LogFactory.getLog(HibernateJpaConfiguration.class);
@@ -237,4 +248,23 @@ public void customize(Map<String, Object> hibernateProperties) {
237248

238249
}
239250

251+
static class HibernateRuntimeHints implements RuntimeHintsRegistrar {
252+
253+
@Override
254+
public void registerHints(RuntimeHints hints, ClassLoader classLoader) {
255+
for (String clazz : NO_JTA_PLATFORM_CLASSES) {
256+
hints.reflection()
257+
.registerType(TypeReference.of(clazz),
258+
TypeHint.builtWith(MemberCategory.INVOKE_DECLARED_CONSTRUCTORS));
259+
}
260+
hints.reflection()
261+
.registerType(SpringImplicitNamingStrategy.class,
262+
TypeHint.builtWith(MemberCategory.INVOKE_DECLARED_CONSTRUCTORS));
263+
hints.reflection()
264+
.registerType(CamelCaseToUnderscoresNamingStrategy.class,
265+
TypeHint.builtWith(MemberCategory.INVOKE_DECLARED_CONSTRUCTORS));
266+
}
267+
268+
}
269+
240270
}

spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaAutoConfigurationTests.java

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,10 @@
4848
import org.hibernate.jpa.HibernatePersistenceProvider;
4949
import org.junit.jupiter.api.Test;
5050

51+
import org.springframework.aot.hint.MemberCategory;
52+
import org.springframework.aot.hint.RuntimeHints;
53+
import org.springframework.aot.hint.TypeReference;
54+
import org.springframework.aot.hint.predicate.RuntimeHintsPredicates;
5155
import org.springframework.beans.factory.BeanCreationException;
5256
import org.springframework.beans.factory.annotation.Autowired;
5357
import org.springframework.boot.autoconfigure.AutoConfigurations;
@@ -57,6 +61,7 @@
5761
import org.springframework.boot.autoconfigure.jdbc.XADataSourceAutoConfiguration;
5862
import org.springframework.boot.autoconfigure.liquibase.LiquibaseAutoConfiguration;
5963
import org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfigurationTests.JpaUsingApplicationListenerConfiguration.EventCapturingApplicationListener;
64+
import org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaConfiguration.HibernateRuntimeHints;
6065
import org.springframework.boot.autoconfigure.orm.jpa.mapping.NonAnnotatedEntity;
6166
import org.springframework.boot.autoconfigure.orm.jpa.test.City;
6267
import org.springframework.boot.autoconfigure.transaction.jta.JtaAutoConfiguration;
@@ -91,6 +96,7 @@
9196
* @author Kazuki Shimizu
9297
* @author Stephane Nicoll
9398
* @author Chris Bono
99+
* @author Moritz Halbritter
94100
*/
95101
class HibernateJpaAutoConfigurationTests extends AbstractJpaAutoConfigurationTests {
96102

@@ -477,6 +483,30 @@ void whenLocalContainerEntityManagerFactoryBeanHasNoJpaVendorAdapterAutoConfigur
477483
});
478484
}
479485

486+
@Test
487+
void registersHintsForJtaClasses() {
488+
RuntimeHints hints = new RuntimeHints();
489+
new HibernateRuntimeHints().registerHints(hints, getClass().getClassLoader());
490+
for (String clazz : Arrays.asList("org.hibernate.engine.transaction.jta.platform.internal.NoJtaPlatform",
491+
"org.hibernate.service.jta.platform.internal.NoJtaPlatform")) {
492+
assertThat(RuntimeHintsPredicates.reflection()
493+
.onType(TypeReference.of(clazz))
494+
.withMemberCategories(MemberCategory.INVOKE_DECLARED_CONSTRUCTORS)).accepts(hints);
495+
}
496+
}
497+
498+
@Test
499+
void registersHintsForNamingClasses() {
500+
RuntimeHints hints = new RuntimeHints();
501+
new HibernateRuntimeHints().registerHints(hints, getClass().getClassLoader());
502+
for (Class<?> clazz : Arrays.asList(SpringImplicitNamingStrategy.class,
503+
CamelCaseToUnderscoresNamingStrategy.class)) {
504+
assertThat(RuntimeHintsPredicates.reflection()
505+
.onType(clazz)
506+
.withMemberCategories(MemberCategory.INVOKE_DECLARED_CONSTRUCTORS)).accepts(hints);
507+
}
508+
}
509+
480510
@Configuration(proxyBeanMethods = false)
481511
@TestAutoConfigurationPackage(City.class)
482512
@DependsOnDatabaseInitialization

0 commit comments

Comments
 (0)