Spring Boot 3.1.4 w/ Spring Data JPA and H2

Reproducer: https://github.com/matthenry87/native-image-multiple-datasource-testing/tree/one-module-use-spring-props

Error:

Caused by: com.oracle.svm.core.jdk.UnsupportedFeatureError: No classes have been predefined during the image build to load from bytecodes at runtime.
        at com.oracle.svm.core.util.VMError.unsupportedFeature(VMError.java:96) ~[na:na]
        at com.oracle.svm.core.hub.PredefinedClassesSupport.throwNoBytecodeClasses(PredefinedClassesSupport.java:76) ~[na:na]
        at com.oracle.svm.core.hub.PredefinedClassesSupport.loadClass(PredefinedClassesSupport.java:130) ~[na:na]
        at java.base@17.0.7/java.lang.ClassLoader.defineClass(ClassLoader.java:294) ~[org.matthenry87.nativetesting.api.ApiApplication:na]
        at net.bytebuddy.utility.dispatcher.JavaDispatcher$DynamicClassLoader.invoker(JavaDispatcher.java:1383) ~[na:na]
        at net.bytebuddy.utility.dispatcher.JavaDispatcher$InvokerCreationAction.run(JavaDispatcher.java:459) ~[na:na]
        at net.bytebuddy.utility.dispatcher.JavaDispatcher$InvokerCreationAction.run(JavaDispatcher.java:452) ~[na:na]
        at java.base@17.0.7/java.security.AccessController.executePrivileged(AccessController.java:171) ~[na:na]
        at java.base@17.0.7/java.security.AccessController.doPrivileged(AccessController.java:318) ~[na:na]
        at net.bytebuddy.utility.dispatcher.JavaDispatcher.doPrivileged(JavaDispatcher.java) ~[na:na]
        at net.bytebuddy.utility.dispatcher.JavaDispatcher.<clinit>(JavaDispatcher.java:87) ~[na:na]
        at net.bytebuddy.description.type.TypeDescription$ForLoadedType.<clinit>(TypeDescription.java:8659) ~[na:na]
        at net.bytebuddy.matcher.ElementMatchers.isFinalizer(ElementMatchers.java:1624) ~[na:na]
        at org.hibernate.bytecode.internal.bytebuddy.ByteBuddyState$ProxyDefinitionHelpers.<init>(ByteBuddyState.java:296) ~[na:na]
        at org.hibernate.bytecode.internal.bytebuddy.ByteBuddyState.<clinit>(ByteBuddyState.java:71) ~[na:na]
        at org.hibernate.bytecode.internal.bytebuddy.BytecodeProviderImpl.<init>(BytecodeProviderImpl.java:124) ~[na:na]
        at org.hibernate.bytecode.internal.bytebuddy.BytecodeProviderImpl.<init>(BytecodeProviderImpl.java:116) ~[na:na]
        at org.hibernate.bytecode.internal.BytecodeProviderInitiator.buildBytecodeProvider(BytecodeProviderInitiator.java:59) ~[na:na]
        at org.hibernate.bytecode.internal.BytecodeProviderInitiator.buildDefaultBytecodeProvider(BytecodeProviderInitiator.java:46) ~[na:na]
        at org.hibernate.jpa.internal.enhance.EnhancingClassTransformerImpl.<init>(EnhancingClassTransformerImpl.java:34) ~[na:na]
        at org.hibernate.jpa.boot.internal.PersistenceUnitInfoDescriptor.pushClassTransformer(PersistenceUnitInfoDescriptor.java:113) ~[org.matthenry87.nativetesting.api.ApiApplication:6.2.9.Final]
        at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.<init>(EntityManagerFactoryBuilderImpl.java:340) ~[na:na]
        at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.<init>(EntityManagerFactoryBuilderImpl.java:190) ~[na:na]
        at org.hibernate.jpa.boot.spi.Bootstrap.getEntityManagerFactoryBuilder(Bootstrap.java:35) ~[na:na]
        at org.hibernate.jpa.boot.spi.Bootstrap.getEntityManagerFactoryBuilder(Bootstrap.java:102) ~[na:na]
        at org.hibernate.jpa.HibernatePersistenceProvider.getEntityManagerFactoryBuilder(HibernatePersistenceProvider.java:169) ~[org.matthenry87.nativetesting.api.ApiApplication:6.2.9.Final]
        at org.hibernate.jpa.HibernatePersistenceProvider.createContainerEntityManagerFactory(HibernatePersistenceProvider.java:142) ~[org.matthenry87.nativetesting.api.ApiApplication:6.2.9.Final]
        at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:376) ~[na:na]
        at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFactory(AbstractEntityManagerFactoryBean.java:409) ~[org.matthenry87.nativetesting.api.ApiApplication:6.0.12]
        at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:396) ~[org.matthenry87.nativetesting.api.ApiApplication:6.0.12]
        at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.afterPropertiesSet(LocalContainerEntityManagerFactoryBean.java:352) ~[na:na]
        at org.matthenry87.nativetesting.api.Db1Config.db1EntityManagerFactory(Db1Config.java:54) ~[org.matthenry87.nativetesting.api.ApiApplication:na]
        at org.matthenry87.nativetesting.api.Db1Config__BeanDefinitions.lambda$getDbEntityManagerFactoryInstanceSupplier$1(Db1Config__BeanDefinitions.java:49) ~[na:na]
        at org.springframework.util.function.ThrowingBiFunction.apply(ThrowingBiFunction.java:68) ~[org.matthenry87.nativetesting.api.ApiApplication:6.0.12]
        at org.springframework.util.function.ThrowingBiFunction.apply(ThrowingBiFunction.java:54) ~[org.matthenry87.nativetesting.api.ApiApplication:6.0.12]
        at org.springframework.beans.factory.aot.BeanInstanceSupplier.lambda$get$2(BeanInstanceSupplier.java:202) ~[na:na]
        at org.springframework.util.function.ThrowingSupplier.get(ThrowingSupplier.java:58) ~[org.matthenry87.nativetesting.api.ApiApplication:6.0.12]
        at org.springframework.util.function.ThrowingSupplier.get(ThrowingSupplier.java:46) ~[org.matthenry87.nativetesting.api.ApiApplication:6.0.12]
        at org.springframework.beans.factory.aot.BeanInstanceSupplier.invokeBeanSupplier(BeanInstanceSupplier.java:214) ~[na:na]
        at org.springframework.beans.factory.aot.BeanInstanceSupplier.get(BeanInstanceSupplier.java:202) ~[na:na]
        at org.springframework.beans.factory.support.DefaultListableBeanFactory.obtainInstanceFromSupplier(DefaultListableBeanFactory.java:947) ~[org.matthenry87.nativetesting.api.ApiApplication:6.0.12]
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.obtainFromSupplier(AbstractAutowireCapableBeanFactory.java:1214) ~[org.matthenry87.nativetesting.api.ApiApplication:6.0.12]
        ... 61 common frames omitted

Comment From: wilkinsona

It works for me using GraalVM 22.3.3 Java 17 CE:

 ./target/api 

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::                (v3.1.4)

2023-10-09T09:24:09.363+01:00  INFO 83949 --- [           main] o.m.nativetesting.api.ApiApplication     : Starting AOT-processed ApiApplication using Java 17.0.8 with PID 83949 (/Users/awilkinson/dev/temp/native-image-multiple-datasource-testing/target/api started by awilkinson in /Users/awilkinson/dev/temp/native-image-multiple-datasource-testing)
2023-10-09T09:24:09.363+01:00  INFO 83949 --- [           main] o.m.nativetesting.api.ApiApplication     : No active profile set, falling back to 1 default profile: "default"
2023-10-09T09:24:09.380+01:00  INFO 83949 --- [           main] o.hibernate.jpa.internal.util.LogHelper  : HHH000204: Processing PersistenceUnitInfo [name: default]
2023-10-09T09:24:09.381+01:00  INFO 83949 --- [           main] org.hibernate.Version                    : HHH000412: Hibernate ORM core version 6.2.9.Final
2023-10-09T09:24:09.382+01:00  WARN 83949 --- [           main] org.hibernate.orm.deprecation            : HHH90000029: The [hibernate.bytecode.use_reflection_optimizer] configuration is deprecated and will be removed. Set the value to [true] to get rid of this warning
2023-10-09T09:24:09.387+01:00  INFO 83949 --- [           main] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Starting...
2023-10-09T09:24:09.394+01:00  INFO 83949 --- [           main] com.zaxxer.hikari.pool.HikariPool        : HikariPool-1 - Added connection conn0: url=jdbc:h2:file:~/test user=SA
2023-10-09T09:24:09.394+01:00  INFO 83949 --- [           main] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Start completed.
2023-10-09T09:24:09.400+01:00  INFO 83949 --- [           main] o.h.b.i.BytecodeProviderInitiator        : HHH000021: Bytecode provider name : none
2023-10-09T09:24:09.405+01:00  INFO 83949 --- [           main] o.h.e.t.j.p.i.JtaPlatformInitiator       : HHH000490: Using JtaPlatform implementation: [org.hibernate.engine.transaction.jta.platform.internal.NoJtaPlatform]
2023-10-09T09:24:09.406+01:00  INFO 83949 --- [           main] j.LocalContainerEntityManagerFactoryBean : Initialized JPA EntityManagerFactory for persistence unit 'default'
2023-10-09T09:24:09.436+01:00  INFO 83949 --- [           main] o.m.nativetesting.api.ApiApplication     : Started ApiApplication in 0.086 seconds (process running for 0.096)
2023-10-09T09:24:09.436+01:00  INFO 83949 --- [           main] o.m.nativetesting.api.ApiApplication     : Injected bean: org.matthenry87.nativetesting.api.db1.Db1Service@161dd63e
2023-10-09T09:24:09.452+01:00  INFO 83949 --- [ionShutdownHook] j.LocalContainerEntityManagerFactoryBean : Closing JPA EntityManagerFactory for persistence unit 'default'
2023-10-09T09:24:09.453+01:00  INFO 83949 --- [ionShutdownHook] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Shutdown initiated...
2023-10-09T09:24:09.479+01:00  INFO 83949 --- [ionShutdownHook] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Shutdown completed.

The JPA-related smoke tests are also in good shape at the moment. Perhaps you can provide some more information about your environment and the steps you're taking to reproduce the problem.

Comment From: matthenry87

Hrm interesting @wilkinsona, I am running mvn spring-boot:build-image -Pnative -DskipTests to build my image. It looks like you are using GraalVM directly.

Can you please try using the Spring Boot Maven Plugin? This the the mechanism I assume most people are using.

Comment From: wilkinsona

This the the mechanism I assume most people are using.

I wouldn't assume that's the case. Even if it were, it isn't what we'd try by default. Unless we've been told that something's needed to reproduce a problem, we won't use it as having as few moving parts as possible speeds up problem diagnosis.

I am running mvn spring-boot:build-image -Pnative -DskipTests to build my image.

That doesn't reproduce the problem for me:

$ docker run docker.io/library/api:1.0.0

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::                (v3.1.4)

2023-10-09T16:33:48.940Z  INFO 1 --- [           main] o.m.nativetesting.api.ApiApplication     : Starting AOT-processed ApiApplication using Java 17.0.7 with PID 1 (/workspace/org.matthenry87.nativetesting.api.ApiApplication started by cnb in /workspace)
2023-10-09T16:33:48.940Z  INFO 1 --- [           main] o.m.nativetesting.api.ApiApplication     : No active profile set, falling back to 1 default profile: "default"
2023-10-09T16:33:49.090Z  INFO 1 --- [           main] o.hibernate.jpa.internal.util.LogHelper  : HHH000204: Processing PersistenceUnitInfo [name: default]
2023-10-09T16:33:49.108Z  INFO 1 --- [           main] org.hibernate.Version                    : HHH000412: Hibernate ORM core version 6.2.9.Final
2023-10-09T16:33:49.110Z  WARN 1 --- [           main] org.hibernate.orm.deprecation            : HHH90000029: The [hibernate.bytecode.use_reflection_optimizer] configuration is deprecated and will be removed. Set the value to [true] to get rid of this warning
2023-10-09T16:33:49.194Z  INFO 1 --- [           main] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Starting...
2023-10-09T16:33:49.226Z  INFO 1 --- [           main] com.zaxxer.hikari.pool.HikariPool        : HikariPool-1 - Added connection conn0: url=jdbc:h2:file:~/test user=SA
2023-10-09T16:33:49.227Z  INFO 1 --- [           main] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Start completed.
2023-10-09T16:33:49.298Z  INFO 1 --- [           main] o.h.b.i.BytecodeProviderInitiator        : HHH000021: Bytecode provider name : none
2023-10-09T16:33:49.373Z  INFO 1 --- [           main] o.h.e.t.j.p.i.JtaPlatformInitiator       : HHH000490: Using JtaPlatform implementation: [org.hibernate.engine.transaction.jta.platform.internal.NoJtaPlatform]
2023-10-09T16:33:49.398Z  INFO 1 --- [           main] j.LocalContainerEntityManagerFactoryBean : Initialized JPA EntityManagerFactory for persistence unit 'default'
2023-10-09T16:33:49.897Z  INFO 1 --- [           main] o.m.nativetesting.api.ApiApplication     : Started ApiApplication in 1.03 seconds (process running for 1.052)
2023-10-09T16:33:49.897Z  INFO 1 --- [           main] o.m.nativetesting.api.ApiApplication     : Injected bean: org.matthenry87.nativetesting.api.db1.Db1Service@5b237638
2023-10-09T16:33:49.924Z  INFO 1 --- [ionShutdownHook] j.LocalContainerEntityManagerFactoryBean : Closing JPA EntityManagerFactory for persistence unit 'default'
2023-10-09T16:33:49.925Z  INFO 1 --- [ionShutdownHook] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Shutdown initiated...
2023-10-09T16:33:49.955Z  INFO 1 --- [ionShutdownHook] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Shutdown completed.

Comment From: matthenry87

Blah yeah issue with this example was on my end. I ran into this error in my multi-module project and started working backwards.

Using spring properties is working for me, but our project is multi-module, and we have some database configurations that are in a shared module, which activate via autoconfiguration. The module lives in the same project/repository as the modules that consume it.

Now instead of using Spring Boot properties, I'm declaring my own HikariDataSource, EntityManagerFactory, and JpaTransactionManager. I've made sure to use the explicit type as the return type on my bean methods. Two lines I notice are different are these:

2023-10-09T23:01:19.700Z  WARN 1 --- [           main] org.hibernate.orm.deprecation            : HHH90000029: The [hibernate.bytecode.use_reflection_optimizer] configuration is deprecated and will be removed. Set the value to [true] to get rid of this warning
2023-10-09T23:01:19.706Z  INFO 1 --- [           main] o.h.b.i.BytecodeProviderInitiator        : HHH000021: Bytecode provider name : bytebuddy

In the working examples above, the Bytecode provider is 'none', but here it's bytebuddy along with a warning about a deprecated hibernate property (hibernate.bytecode.use_reflection_optimizer)

Same stack trace as above though:

2023-10-09T23:36:37.305Z  INFO 1 --- [           main] o.m.nativetesting.api.ApiApplication     : Starting AOT-processed ApiApplication using Java 17.0.7 with PID 1 (/workspace/org.matthenry87.nativetesting.api.ApiApplication started by cnb in /workspace)
2023-10-09T23:36:37.305Z  INFO 1 --- [           main] o.m.nativetesting.api.ApiApplication     : No active profile set, falling back to 1 default profile: "default"
2023-10-09T23:36:37.319Z  INFO 1 --- [           main] o.hibernate.jpa.internal.util.LogHelper  : HHH000204: Processing PersistenceUnitInfo [name: db1Persist]
2023-10-09T23:36:37.322Z  INFO 1 --- [           main] org.hibernate.Version                    : HHH000412: Hibernate ORM core version 6.2.9.Final
2023-10-09T23:36:37.323Z  WARN 1 --- [           main] org.hibernate.orm.deprecation            : HHH90000029: The [hibernate.bytecode.use_reflection_optimizer] configuration is deprecated and will be removed. Set the value to [true] to get rid of this warning
2023-10-09T23:36:37.329Z  INFO 1 --- [           main] o.h.b.i.BytecodeProviderInitiator        : HHH000021: Bytecode provider name : bytebuddy
2023-10-09T23:36:37.330Z  WARN 1 --- [           main] o.s.c.support.GenericApplicationContext  : Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'db1Service': Unsatisfied dependency expressed through constructor parameter 0: Error creating bean with name 'fooEntityRepository': Cannot resolve reference to bean 'jpaSharedEM_db1EntityManagerFactory' while setting bean property 'entityManager'
2023-10-09T23:36:37.331Z ERROR 1 --- [           main] o.s.boot.SpringApplication               : Application run failed

...Omitted...

Caused by: com.oracle.svm.core.jdk.UnsupportedFeatureError: No classes have been predefined during the image build to load from bytecodes at runtime.
        at com.oracle.svm.core.util.VMError.unsupportedFeature(VMError.java:96) ~[na:na]
        at com.oracle.svm.core.hub.PredefinedClassesSupport.throwNoBytecodeClasses(PredefinedClassesSupport.java:76) ~[na:na]
        at com.oracle.svm.core.hub.PredefinedClassesSupport.loadClass(PredefinedClassesSupport.java:130) ~[na:na]
        at java.base@17.0.7/java.lang.ClassLoader.defineClass(ClassLoader.java:294) ~[org.matthenry87.nativetesting.api.ApiApplication:na]
        at net.bytebuddy.utility.dispatcher.JavaDispatcher$DynamicClassLoader.invoker(JavaDispatcher.java:1383) ~[na:na]
        at net.bytebuddy.utility.dispatcher.JavaDispatcher$InvokerCreationAction.run(JavaDispatcher.java:459) ~[na:na]
        at net.bytebuddy.utility.dispatcher.JavaDispatcher$InvokerCreationAction.run(JavaDispatcher.java:452) ~[na:na]
        at java.base@17.0.7/java.security.AccessController.executePrivileged(AccessController.java:171) ~[na:na]
        at java.base@17.0.7/java.security.AccessController.doPrivileged(AccessController.java:318) ~[na:na]
        at net.bytebuddy.utility.dispatcher.JavaDispatcher.doPrivileged(JavaDispatcher.java) ~[na:na]
        at net.bytebuddy.utility.dispatcher.JavaDispatcher.<clinit>(JavaDispatcher.java:87) ~[na:na]
        at net.bytebuddy.description.type.TypeDescription$ForLoadedType.<clinit>(TypeDescription.java:8659) ~[na:na]
        at net.bytebuddy.matcher.ElementMatchers.isFinalizer(ElementMatchers.java:1624) ~[na:na]
        at org.hibernate.bytecode.internal.bytebuddy.ByteBuddyState$ProxyDefinitionHelpers.<init>(ByteBuddyState.java:296) ~[na:na]
        at org.hibernate.bytecode.internal.bytebuddy.ByteBuddyState.<clinit>(ByteBuddyState.java:71) ~[na:na]
        at org.hibernate.bytecode.internal.bytebuddy.BytecodeProviderImpl.<init>(BytecodeProviderImpl.java:124) ~[na:na]
        at org.hibernate.bytecode.internal.bytebuddy.BytecodeProviderImpl.<init>(BytecodeProviderImpl.java:116) ~[na:na]
        at org.hibernate.bytecode.internal.BytecodeProviderInitiator.buildBytecodeProvider(BytecodeProviderInitiator.java:59) ~[na:na]
        at org.hibernate.bytecode.internal.BytecodeProviderInitiator.buildDefaultBytecodeProvider(BytecodeProviderInitiator.java:46) ~[na:na]
        at org.hibernate.jpa.internal.enhance.EnhancingClassTransformerImpl.<init>(EnhancingClassTransformerImpl.java:34) ~[na:na]
        at org.hibernate.jpa.boot.internal.PersistenceUnitInfoDescriptor.pushClassTransformer(PersistenceUnitInfoDescriptor.java:113) ~[org.matthenry87.nativetesting.api.ApiApplication:6.2.9.Final]
        at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.<init>(EntityManagerFactoryBuilderImpl.java:340) ~[na:na]
        at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.<init>(EntityManagerFactoryBuilderImpl.java:190) ~[na:na]
        at org.hibernate.jpa.boot.spi.Bootstrap.getEntityManagerFactoryBuilder(Bootstrap.java:35) ~[na:na]
        at org.hibernate.jpa.boot.spi.Bootstrap.getEntityManagerFactoryBuilder(Bootstrap.java:102) ~[na:na]
        at org.hibernate.jpa.HibernatePersistenceProvider.getEntityManagerFactoryBuilder(HibernatePersistenceProvider.java:169) ~[org.matthenry87.nativetesting.api.ApiApplication:6.2.9.Final]
        at org.hibernate.jpa.HibernatePersistenceProvider.createContainerEntityManagerFactory(HibernatePersistenceProvider.java:142) ~[org.matthenry87.nativetesting.api.ApiApplication:6.2.9.Final]
        at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:376) ~[na:na]
        at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFactory(AbstractEntityManagerFactoryBean.java:409) ~[org.matthenry87.nativetesting.api.ApiApplication:6.0.12]
        at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:396) ~[org.matthenry87.nativetesting.api.ApiApplication:6.0.12]
        at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.afterPropertiesSet(LocalContainerEntityManagerFactoryBean.java:352) ~[na:na]
        at org.matthenry87.nativetesting.api.db1.Db1Config.db1EntityManagerFactory(Db1Config.java:63) ~[org.matthenry87.nativetesting.api.ApiApplication:na]
        at org.matthenry87.nativetesting.api.db1.Db1Config$$SpringCGLIB$$0.CGLIB$db1EntityManagerFactory$1(<generated>) ~[org.matthenry87.nativetesting.api.ApiApplication:na]
        at org.matthenry87.nativetesting.api.db1.Db1Config$$SpringCGLIB$$2.invoke(<generated>) ~[org.matthenry87.nativetesting.api.ApiApplication:na]
        at org.springframework.cglib.proxy.MethodProxy.invokeSuper(MethodProxy.java:258) ~[org.matthenry87.nativetesting.api.ApiApplication:6.0.12]
        at org.springframework.context.annotation.ConfigurationClassEnhancer$BeanMethodInterceptor.intercept(ConfigurationClassEnhancer.java:331) ~[na:na]
        at org.matthenry87.nativetesting.api.db1.Db1Config$$SpringCGLIB$$0.db1EntityManagerFactory(<generated>) ~[org.matthenry87.nativetesting.api.ApiApplication:na]
        at org.matthenry87.nativetesting.api.db1.Db1Config__BeanDefinitions.lambda$getDbEntityManagerFactoryInstanceSupplier$2(Db1Config__BeanDefinitions.java:60) ~[na:na]
        at org.springframework.util.function.ThrowingBiFunction.apply(ThrowingBiFunction.java:68) ~[org.matthenry87.nativetesting.api.ApiApplication:6.0.12]
        at org.springframework.util.function.ThrowingBiFunction.apply(ThrowingBiFunction.java:54) ~[org.matthenry87.nativetesting.api.ApiApplication:6.0.12]
        at org.springframework.beans.factory.aot.BeanInstanceSupplier.lambda$get$2(BeanInstanceSupplier.java:202) ~[na:na]
        at org.springframework.util.function.ThrowingSupplier.get(ThrowingSupplier.java:58) ~[org.matthenry87.nativetesting.api.ApiApplication:6.0.12]
        at org.springframework.util.function.ThrowingSupplier.get(ThrowingSupplier.java:46) ~[org.matthenry87.nativetesting.api.ApiApplication:6.0.12]
        at org.springframework.beans.factory.aot.BeanInstanceSupplier.invokeBeanSupplier(BeanInstanceSupplier.java:214) ~[na:na]
        at org.springframework.beans.factory.aot.BeanInstanceSupplier.get(BeanInstanceSupplier.java:202) ~[na:na]
        at org.springframework.beans.factory.support.DefaultListableBeanFactory.obtainInstanceFromSupplier(DefaultListableBeanFactory.java:947) ~[org.matthenry87.nativetesting.api.ApiApplication:6.0.12]
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.obtainFromSupplier(AbstractAutowireCapableBeanFactory.java:1214) ~[org.matthenry87.nativetesting.api.ApiApplication:6.0.12]
        ... 61 common frames omitted

Here is my reproducer (same repo different branch): https://github.com/matthenry87/native-image-multiple-datasource-testing/tree/one-module-one-db

Comment From: wilkinsona

The problem's in your configuration of the entity manager factory. By setting the persistence provider, you're overriding the default (SpringHibernateJpaPersistenceProvider) from HibernateJpaVendorAdapter and therefore losing its configuration of the bytecode provider. Removing emf.setPersistenceProviderClass(HibernatePersistenceProvider.class); fixes the problem.

With this change in place the native image fails to start in the same way as spring-boot:run due to misconfiguration of Hikari. Changing jdc-url to url in application.yml fixes that and the app starts on the JVM but fails in a native image due to FooEntity not being a managed type. It isn't a managed type because you are not using PersistenceManagedTypes as Boot's auto-config does:

https://github.com/spring-projects/spring-boot/blob/7b1059a4b510e9fd58e6a3816e919ea52088546d/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/orm/jpa/JpaBaseConfiguration.java#L195-L201

https://github.com/spring-projects/spring-boot/blob/7b1059a4b510e9fd58e6a3816e919ea52088546d/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/orm/jpa/JpaBaseConfiguration.java#L135

With this corrected, the relevant @Bean methods look like this:

@Bean(name = "db1PersistenceManagedTypes")
PersistenceManagedTypes db1PersistenceManagedTypes(ResourceLoader resourceLoader) {
    return new PersistenceManagedTypesScanner(resourceLoader).scan("org.matthenry87.nativetesting.api.db1");
}

@Bean(name = "db1EntityManagerFactory")
EntityManagerFactory db1EntityManagerFactory(@Qualifier("db1ServerDataSource") DataSource db1ServerDataSource, PersistenceManagedTypes managedTypes) {
    Map<String, Object> properties = new HashMap<>();
    properties.put("hibernate.hbm2ddl.auto", "create-drop");
    properties.put("generate-ddl", "true");
    LocalContainerEntityManagerFactoryBean emf = new LocalContainerEntityManagerFactoryBean();
    emf.setDataSource(db1ServerDataSource);
    emf.setJpaVendorAdapter(new HibernateJpaVendorAdapter());
    emf.setPersistenceUnitName("db1Persist");
    emf.setManagedTypes(managedTypes);
    emf.setJpaPropertyMap(properties);
    emf.afterPropertiesSet();

    return emf.getObject();
}

The app now starts both on the JVM and in a native image.

Comment From: matthenry87

@wilkinsona Thank you for the guidance, much appreciated.