Hi.

I'm attempting to build a native application using Spring Boot 3.2.0-M3, Java 21, and GraalVM 23.1.0 on Windows. In my special case, I require two datasources, so I cannot depend on autoconfiguration via application.yml (which I tested successfully for a single datasource). Instead, I must manually configure both DataSources, along with their respective EntityManager and TransactionManager.

In normal mode, the application runs as expected. However, when compiled natively and executed, I encounter the following error:

Caused by: java.lang.IllegalArgumentException: Not a managed type: class com.sbnative.entity.db1.Venta


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

2023-10-08T22:36:36.897-05:00  INFO 21000 --- [sb-native] [           main] com.sbnative.SyncWebApplication          : Starting AOT-processed SyncWebApplication using Java 21 with PID 21000 
2023-10-08T22:36:36.898-05:00  INFO 21000 --- [sb-native] [           main] com.sbnative.SyncWebApplication          : The following 1 profile is active: "prod"
2023-10-08T22:36:36.936-05:00  INFO 21000 --- [sb-native] [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat initialized with port 8080 (http)
2023-10-08T22:36:36.937-05:00  INFO 21000 --- [sb-native] [           main] o.apache.catalina.core.StandardService   : Starting service [Tomcat]
2023-10-08T22:36:36.937-05:00  INFO 21000 --- [sb-native] [           main] o.apache.catalina.core.StandardEngine    : Starting Servlet engine: [Apache Tomcat/10.1.13]
2023-10-08T22:36:36.943-05:00  INFO 21000 --- [sb-native] [           main] o.a.c.c.C.[.[localhost].[/sbnative]      : Initializing Spring embedded WebApplicationContext
2023-10-08T22:36:36.943-05:00  INFO 21000 --- [sb-native] [           main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 45 ms
2023-10-08T22:36:37.512-05:00  INFO 21000 --- [sb-native] [           main] o.hibernate.jpa.internal.util.LogHelper  : HHH000204: Processing PersistenceUnitInfo [name: db1]
2023-10-08T22:36:37.515-05:00  INFO 21000 --- [sb-native] [           main] org.hibernate.Version                    : HHH000412: Hibernate ORM core version 6.3.1.Final
2023-10-08T22:36:37.517-05:00  INFO 21000 --- [sb-native] [           main] o.h.c.internal.RegionFactoryInitiator    : HHH000026: Second-level cache disabled
2023-10-08T22:36:37.522-05:00  WARN 21000 --- [sb-native] [           main] org.hibernate.orm.deprecation            : HHH90000025: MySQLDialect does not need to be specified explicitly using 'hibernate.dialect' (remove the property setting and it will be selected by default)
2023-10-08T22:36:37.529-05:00  INFO 21000 --- [sb-native] [           main] o.h.e.t.j.p.i.JtaPlatformInitiator       : HHH000489: No JTA platform available (set 'hibernate.transaction.jta.platform' to enable JTA platform integration)
2023-10-08T22:36:37.529-05:00  INFO 21000 --- [sb-native] [           main] j.LocalContainerEntityManagerFactoryBean : Initialized JPA EntityManagerFactory for persistence unit 'db1'
2023-10-08T22:36:37.650-05:00  INFO 21000 --- [sb-native] [           main] o.hibernate.jpa.internal.util.LogHelper  : HHH000204: Processing PersistenceUnitInfo [name: db2]
2023-10-08T22:36:37.652-05:00  INFO 21000 --- [sb-native] [           main] o.h.c.internal.RegionFactoryInitiator    : HHH000026: Second-level cache disabled
2023-10-08T22:36:37.654-05:00  WARN 21000 --- [sb-native] [           main] org.hibernate.orm.deprecation            : HHH90000025: MySQLDialect does not need to be specified explicitly using 'hibernate.dialect' (remove the property setting and it will be selected by default)
2023-10-08T22:36:37.657-05:00  INFO 21000 --- [sb-native] [           main] o.h.e.t.j.p.i.JtaPlatformInitiator       : HHH000489: No JTA platform available (set 'hibernate.transaction.jta.platform' to enable JTA platform integration)
2023-10-08T22:36:37.657-05:00  INFO 21000 --- [sb-native] [           main] j.LocalContainerEntityManagerFactoryBean : Initialized JPA EntityManagerFactory for persistence unit 'db2'
2023-10-08T22:36:37.669-05:00  WARN 21000 --- [sb-native] [           main] w.s.c.ServletWebServerApplicationContext : Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'ventaController': Unsatisfied dependency expressed through constructor parameter 0: Error creating bean with name 'ventaService': Unsatisfied dependency expressed through constructor parameter 0: Error creating bean with name 'ventaRepository': Not a managed type: class com.sbnative.entity.db1.Venta
2023-10-08T22:36:37.669-05:00  INFO 21000 --- [sb-native] [           main] j.LocalContainerEntityManagerFactoryBean : Closing JPA EntityManagerFactory for persistence unit 'db2'
2023-10-08T22:36:37.669-05:00  INFO 21000 --- [sb-native] [           main] j.LocalContainerEntityManagerFactoryBean : Closing JPA EntityManagerFactory for persistence unit 'db1'
2023-10-08T22:36:37.669-05:00  INFO 21000 --- [sb-native] [           main] o.apache.catalina.core.StandardService   : Stopping service [Tomcat]
2023-10-08T22:36:37.670-05:00 ERROR 21000 --- [sb-native] [           main] o.s.boot.SpringApplication               : Application run failed

org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'ventaController': Unsatisfied dependency expressed through constructor parameter 0: Error creating bean with name 'ventaService': Unsatisfied dependency expressed through constructor parameter 0: Error creating bean with name 'ventaRepository': Not a managed type: class com.sbnative.entity.db1.Venta
    at org.springframework.beans.factory.aot.BeanInstanceSupplier.resolveArgument(BeanInstanceSupplier.java:318) ~[na:na]
    at org.springframework.beans.factory.aot.BeanInstanceSupplier.resolveArguments(BeanInstanceSupplier.java:261) ~[na:na]
    at org.springframework.beans.factory.aot.BeanInstanceSupplier.get(BeanInstanceSupplier.java:201) ~[na:na]
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.obtainInstanceFromSupplier(DefaultListableBeanFactory.java:947) ~[Native.exe:6.1.0-M5]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.obtainFromSupplier(AbstractAutowireCapableBeanFactory.java:1218) ~[Native.exe:6.1.0-M5]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1162) ~[Native.exe:6.1.0-M5]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:563) ~[Native.exe:6.1.0-M5]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:523) ~[Native.exe:6.1.0-M5]
    at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:325) ~[Native.exe:6.1.0-M5]
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) ~[Native.exe:6.1.0-M5]
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:323) ~[Native.exe:6.1.0-M5]
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:199) ~[Native.exe:6.1.0-M5]
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:973) ~[Native.exe:6.1.0-M5]
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:939) ~[Native.exe:6.1.0-M5]
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:608) ~[Native.exe:6.1.0-M5]
    at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:146) ~[Native.exe:3.2.0-M3]
    at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:737) ~[Native.exe:3.2.0-M3]
    at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:439) ~[Native.exe:3.2.0-M3]
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:315) ~[Native.exe:3.2.0-M3]
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1309) ~[Native.exe:3.2.0-M3]
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1298) ~[Native.exe:3.2.0-M3]
    at com.sbnative.SyncWebApplication.main(SyncWebApplication.java:17) ~[Native.exe:na]
    at java.base@21/java.lang.invoke.LambdaForm$DMH/sa346b79c.invokeStaticInit(LambdaForm$DMH) ~[na:na]
Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'ventaService': Unsatisfied dependency expressed through constructor parameter 0: Error creating bean with name 'ventaRepository': Not a managed type: class com.sbnative.entity.db1.Venta
    at org.springframework.beans.factory.aot.BeanInstanceSupplier.resolveArgument(BeanInstanceSupplier.java:318) ~[na:na]
    at org.springframework.beans.factory.aot.BeanInstanceSupplier.resolveArguments(BeanInstanceSupplier.java:261) ~[na:na]
    at org.springframework.beans.factory.aot.BeanInstanceSupplier.get(BeanInstanceSupplier.java:201) ~[na:na]
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.obtainInstanceFromSupplier(DefaultListableBeanFactory.java:947) ~[Native.exe:6.1.0-M5]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.obtainFromSupplier(AbstractAutowireCapableBeanFactory.java:1218) ~[Native.exe:6.1.0-M5]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1162) ~[Native.exe:6.1.0-M5]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:563) ~[Native.exe:6.1.0-M5]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:523) ~[Native.exe:6.1.0-M5]
    at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:325) ~[Native.exe:6.1.0-M5]
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) ~[Native.exe:6.1.0-M5]
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:323) ~[Native.exe:6.1.0-M5]
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:199) ~[Native.exe:6.1.0-M5]
    at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:254) ~[Native.exe:6.1.0-M5]
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1441) ~[Native.exe:6.1.0-M5]
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1348) ~[Native.exe:6.1.0-M5]
    at org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:910) ~[na:na]
    at org.springframework.beans.factory.support.RegisteredBean.resolveAutowiredArgument(RegisteredBean.java:229) ~[Native.exe:6.1.0-M5]
    at org.springframework.beans.factory.aot.BeanInstanceSupplier.resolveArgument(BeanInstanceSupplier.java:315) ~[na:na]
    ... 22 common frames omitted
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'ventaRepository': Not a managed type: class com.sbnative.entity.db1.Venta
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1775) ~[Native.exe:6.1.0-M5]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:601) ~[Native.exe:6.1.0-M5]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:523) ~[Native.exe:6.1.0-M5]
    at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:325) ~[Native.exe:6.1.0-M5]
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) ~[Native.exe:6.1.0-M5]
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:323) ~[Native.exe:6.1.0-M5]
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:199) ~[Native.exe:6.1.0-M5]
    at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:254) ~[Native.exe:6.1.0-M5]
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1441) ~[Native.exe:6.1.0-M5]
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1348) ~[Native.exe:6.1.0-M5]
    at org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:910) ~[na:na]
    at org.springframework.beans.factory.support.RegisteredBean.resolveAutowiredArgument(RegisteredBean.java:229) ~[Native.exe:6.1.0-M5]
    at org.springframework.beans.factory.aot.BeanInstanceSupplier.resolveArgument(BeanInstanceSupplier.java:315) ~[na:na]
    ... 39 common frames omitted
Caused by: java.lang.IllegalArgumentException: Not a managed type: class com.sbnative.entity.db1.Venta
    at org.hibernate.metamodel.model.domain.internal.JpaMetamodelImpl.managedType(JpaMetamodelImpl.java:193) ~[na:na]
    at org.hibernate.metamodel.model.domain.internal.MappingMetamodelImpl.managedType(MappingMetamodelImpl.java:463) ~[na:na]
    at org.hibernate.metamodel.model.domain.internal.MappingMetamodelImpl.managedType(MappingMetamodelImpl.java:97) ~[na:na]
    at org.springframework.data.jpa.repository.support.JpaMetamodelEntityInformation.<init>(JpaMetamodelEntityInformation.java:82) ~[Native.exe:3.2.0-M3]
    at org.springframework.data.jpa.repository.support.JpaEntityInformationSupport.getEntityInformation(JpaEntityInformationSupport.java:69) ~[Native.exe:3.2.0-M3]
    at org.springframework.data.jpa.repository.support.JpaRepositoryFactory.getEntityInformation(JpaRepositoryFactory.java:246) ~[Native.exe:3.2.0-M3]
    at org.springframework.data.jpa.repository.support.JpaRepositoryFactory.getTargetRepository(JpaRepositoryFactory.java:211) ~[Native.exe:3.2.0-M3]
    at org.springframework.data.jpa.repository.support.JpaRepositoryFactory.getTargetRepository(JpaRepositoryFactory.java:194) ~[Native.exe:3.2.0-M3]
    at org.springframework.data.jpa.repository.support.JpaRepositoryFactory.getTargetRepository(JpaRepositoryFactory.java:81) ~[Native.exe:3.2.0-M3]
    at org.springframework.data.repository.core.support.RepositoryFactorySupport.getRepository(RepositoryFactorySupport.java:317) ~[Native.exe:3.2.0-M3]
    at org.springframework.data.repository.core.support.RepositoryFactoryBeanSupport.lambda$afterPropertiesSet$5(RepositoryFactoryBeanSupport.java:279) ~[Native.exe:3.2.0-M3]
    at org.springframework.data.util.Lazy.getNullable(Lazy.java:135) ~[na:na]
    at org.springframework.data.util.Lazy.get(Lazy.java:113) ~[na:na]
    at org.springframework.data.repository.core.support.RepositoryFactoryBeanSupport.afterPropertiesSet(RepositoryFactoryBeanSupport.java:285) ~[Native.exe:3.2.0-M3]
    at org.springframework.data.jpa.repository.support.JpaRepositoryFactoryBean.afterPropertiesSet(JpaRepositoryFactoryBean.java:132) ~[Native.exe:3.2.0-M3]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1822) ~[Native.exe:6.1.0-M5]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1771) ~[Native.exe:6.1.0-M5]
    ... 51 common frames omitted

This is the code for creating the datasource that I'm using:

@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(
    basePackages = {"com.sbnative.repository.db1"},
    entityManagerFactoryRef = "entityManager1",
    transactionManagerRef = "transactionManager1"
)
@RegisterReflectionForBinding(Venta.class)
@RequiredArgsConstructor
@Slf4j
public class DataSourceServiciosConfig {

    @Value("${sbnative.bds.db1.secret-name}")
    private final String secretName;
    @Value("${sbnative.bds.db1.database}")
    private final String databaseName;

    private final DataSourceCommons dataSourceCommons;

    @Bean(name = "dataSource1")
    @Primary
    public DataSource dataSource1() throws Exception {
        return dataSourceCommons.getHikariDataSource(secretName, databaseName, "ConnectionPool1");
    }

    @Bean(name = "entityManager1")
    @Primary
    public LocalContainerEntityManagerFactoryBean entityManager1(EntityManagerFactoryBuilder builder, @Qualifier("dataSource1") DataSource dataSource) {
        return builder
            .dataSource(dataSource)
            .packages("com.sbnative.entity.db1")
            .persistenceUnit("db1")
            .build()
        ;
    }

    @Bean(name = "transactionManager1")
    @Primary
    public PlatformTransactionManager transactionManager1(@Qualifier("entityManager1") EntityManagerFactory entityManagerFactory) {
        return new JpaTransactionManager(entityManagerFactory);
    }

}

And this is the definition of the entity:

@Getter
@Setter
@Entity
@Table(name = "rjrb_ventas")
public class Venta {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "codigo", nullable = false)
    private Integer id;

    @NotNull
    @Column(name = "fecha", nullable = false)
    private LocalDateTime fecha;

    @NotNull
    @Column(name = "articulo", nullable = false)
    private Integer articulo;

    @NotNull
    @Column(name = "cantidad", nullable = false)
    private Integer cantidad;

    @NotNull
    @Column(name = "precio", nullable = false)
    private Integer precio;

    @NotNull
    @Column(name = "servicio_envio", nullable = false)
    private Integer servicioEnvio;

    @Column(name = "descuento")
    private Integer descuento;

    @NotNull
    @Column(name = "exportado", nullable = false)
    private Boolean exportado = false;

    @NotNull
    @Column(name = "id_orden", nullable = false)
    private Integer idOrden;

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Venta venta = (Venta) o;
        return Objects.equals(id, venta.id);
    }

    @Override
    public int hashCode() {
        return Objects.hash(id);
    }

}

I found someone who already asked a similar question sometime ago but there were no answers: IllegalArgumentException: Not a managed type: Entity in Spring GraalVM native compile

I'm attaching my sample application.

Thanks.

Native.zip

Comment From: wilkinsona

This appears to be a duplicate of https://github.com/spring-projects/spring-data-jpa/issues/2753.