Skip to content

HibernateException when compiling to native image #38898

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
CROprogrammer opened this issue Dec 21, 2023 · 11 comments
Closed

HibernateException when compiling to native image #38898

CROprogrammer opened this issue Dec 21, 2023 · 11 comments

Comments

@CROprogrammer
Copy link

I'm using:

  • Spring Boot 3.2.0
  • Java 21

I'm trying to compile native image, and when I do so, I get this error:

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [org/springframework/boot/autoconfigure/orm
/jpa/HibernateJpaConfiguration.class]: [PersistenceUnit: default] Unable to build Hibernate SessionFactory; nested exception is org.hibernate.HibernateException: Using the ReflectionOptimizer is not possible when the configured BytecodeProvider is 'none'. Use a different BytecodeProvider
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1775)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:601)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:523)
        at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:325)
        at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234)
        at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:323)
        at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:199)
        at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1173)
        at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:936)
        at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:616)
        at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:146)
        at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:753)
        at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:455)
        at org.springframework.boot.SpringApplication.run(SpringApplication.java:323)
        at org.springframework.boot.SpringApplication.run(SpringApplication.java:1342)
        at org.springframework.boot.SpringApplication.run(SpringApplication.java:1331)
        at net.croz.hrokb2b.HrokB2bApplication.main(HrokB2bApplication.java:11)
Caused by: jakarta.persistence.PersistenceException: [PersistenceUnit: default] Unable to build Hibernate SessionFactory; nested exception is org.hibernate.HibernateException: Using the ReflectionOptimizer is not possible when the configured BytecodeProvider is 'none'. Use a different BytecodeProvider
        at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFactory(AbstractEntityManagerFactoryBean.java:421)
        at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:396)
        at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.afterPropertiesSet(LocalContainerEntityManagerFactoryBean.java:352)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1822)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1771)
        ... 16 common frames omitted
Caused by: org.hibernate.HibernateException: Using the ReflectionOptimizer is not possible when the configured BytecodeProvider is 'none'. Use a different BytecodeProvider
        at org.hibernate.bytecode.internal.none.BytecodeProviderImpl.getReflectionOptimizer(BytecodeProviderImpl.java:48)
        at org.hibernate.metamodel.internal.EntityRepresentationStrategyPojoStandard.resolveReflectionOptimizer(EntityRepresentationStrategyPojoStandard.java:289)
        at org.hibernate.metamodel.internal.EntityRepresentationStrategyPojoStandard.<init>(EntityRepresentationStrategyPojoStandard.java:160)
        at org.hibernate.metamodel.internal.ManagedTypeRepresentationResolverStandard.resolveStrategy(ManagedTypeRepresentationResolverStandard.java:62)
        at org.hibernate.persister.entity.AbstractEntityPersister.<init>(AbstractEntityPersister.java:519)
        at org.hibernate.persister.entity.SingleTableEntityPersister.<init>(SingleTableEntityPersister.java:135)
        at java.base/jdk.internal.reflect.DirectConstructorHandleAccessor.newInstance(DirectConstructorHandleAccessor.java:62)
        at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:502)
        at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:486)
        at org.hibernate.persister.internal.PersisterFactoryImpl.createEntityPersister(PersisterFactoryImpl.java:92)
        at org.hibernate.persister.internal.PersisterFactoryImpl.createEntityPersister(PersisterFactoryImpl.java:75)
        at org.hibernate.metamodel.model.domain.internal.MappingMetamodelImpl.processBootEntities(MappingMetamodelImpl.java:243)
        at org.hibernate.metamodel.model.domain.internal.MappingMetamodelImpl.finishInitialization(MappingMetamodelImpl.java:181)
        at org.hibernate.internal.SessionFactoryImpl.initializeMappingModel(SessionFactoryImpl.java:323)
        at org.hibernate.internal.SessionFactoryImpl.<init>(SessionFactoryImpl.java:273)
        at org.hibernate.boot.internal.SessionFactoryBuilderImpl.build(SessionFactoryBuilderImpl.java:450)
        at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:1507)
        at org.springframework.orm.jpa.vendor.SpringHibernateJpaPersistenceProvider.createContainerEntityManagerFactory(SpringHibernateJpaPersistenceProvider.java:75)
        at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:376)
        at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFactory(AbstractEntityManagerFactoryBean.java:409)
        ... 20 common frames omitted
@spring-projects-issues spring-projects-issues added the status: waiting-for-triage An issue we've not yet triaged label Dec 21, 2023
@wilkinsona
Copy link
Member

Hibernate appears to be misconfigured but we cannot tell why that is the case as you have not shared any information about how you're using it. If you would like us to spend some more time investigating, please spend some time providing a complete yet minimal sample that reproduces the problem. You can share it with us by pushing it to a separate repository on GitHub or by zipping it up and attaching it to this issue.

@wilkinsona wilkinsona added the status: waiting-for-feedback We need additional information before we can continue label Jan 2, 2024
@spring-projects-issues
Copy link
Collaborator

If you would like us to look at this issue, please provide the requested information. If the information is not provided within the next 7 days this issue will be closed.

@spring-projects-issues spring-projects-issues added the status: feedback-reminder We've sent a reminder that we need additional information before we can continue label Jan 9, 2024
@spring-projects-issues
Copy link
Collaborator

Closing due to lack of requested feedback. If you would like us to look at this issue, please provide the requested information and we will re-open the issue.

@spring-projects-issues spring-projects-issues closed this as not planned Won't fix, can't repro, duplicate, stale Jan 16, 2024
@spring-projects-issues spring-projects-issues removed status: waiting-for-feedback We need additional information before we can continue status: feedback-reminder We've sent a reminder that we need additional information before we can continue status: waiting-for-triage An issue we've not yet triaged labels Jan 16, 2024
@ahp-tams
Copy link

ahp-tams commented Feb 7, 2024

This is no configuration problem. The property hibernate.bytecode.use_reflection_optimize was simply removed
and is not checked any more, so that BytecodeProviderImpl.java throws an exception when asked for the reflection optimizer.
I am currently suffering from this problem, too, it costs me 5 seconds startup time with 840 entity classes.

@wilkinsona
Copy link
Member

We have a smoke test for JPA in a native image that passes so we're as confident as we can be that this is, in fact, a configuration problem. If you have evidence to the contrary, please share it with us in the form a minimal sample that reproduces your problem and we'll happily take a look at it.

@ahp-tams
Copy link

ahp-tams commented Feb 7, 2024

We have a smoke test for JPA in a native image...

Thank you for your answer. My project does not run in a native image, but on jvm. To reproduce you only have to set hibernate.bytecode.provider=none and start any small jpa project in the jvm. Maybe I am using the wrong configuration property to disable the reflection optimizer? I only know of hibernate.bytecode.use_reflection_optimizer=false, wich does not work any more. If there is another property to disable it, I would be happy, but I couldn't find one yet, even in the sourcecode.
If the reflection optimizer isn't disabled, the BytecodeProviderImpl will surely throw that exception.

@wilkinsona
Copy link
Member

Then this issue isn't relevant as it's specifically about a HibernateException being thrown when compiling to a native image.

Hibernate's own properties are, largely, out of Spring Boot's control. If you're not sure which Hibernate properties to use to get Hibernate to behave as you require, asking the Hibernate community or maintainers is a better option.

@ahp-tams
Copy link

ahp-tams commented Feb 7, 2024

Then this issue isn't relevant as it's specifically about a HibernateException being thrown when compiling to a native image.

Ok, I see, wrong ticket. I know, wich hibernate properties to use to disable the bytecode optimizer. But then, the jvm build isn't usable any more in spring boot, see spring-projects/spring-framework#31051 if you wish.
I will fork hibernate and modify it to my needs, thank you.

@slowbreathing
Copy link

slowbreathing commented Mar 11, 2025

(https://drive.google.com/file/d/1VhiNjbatpojBah1XOaYRBN8NKWDMkzpw/view?usp=sharing)

Have been hitting this issue regularly with SpringBoot 3.4.x

Above is complete yet minimal sample that reproduces the problem. 2 sets of command produce similar but not identical errors.

Below are the commands to recreate it with Gradle 7.6.4 and Graal Java(TM) SE Runtime Environment Oracle GraalVM 17.0.11+7.1

1. gradle build -x test :microservices:review-service:nativeCompile -Pprofile=instrumented &&
docker compose -f docker-compose-app-native-instrumented.yml build &&
docker compose -f docker-compose-app-native-instrumented.yml up

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory': null
native-query-error3-review-1  | 	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1812)
native-query-error3-review-1  | 	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:601)
native-query-error3-review-1  | 	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:523)
native-query-error3-review-1  | 	at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:339)
native-query-error3-review-1  | 	at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:346)
native-query-error3-review-1  | 	at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:337)
native-query-error3-review-1  | 	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:207)
native-query-error3-review-1  | 	at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:970)
native-query-error3-review-1  | 	at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:627)
native-query-error3-review-1  | 	at org.springframework.boot.web.reactive.context.ReactiveWebServerApplicationContext.refresh(ReactiveWebServerApplicationContext.java:66)
native-query-error3-review-1  | 	at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:752)
native-query-error3-review-1  | 	at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:439)
native-query-error3-review-1  | 	at org.springframework.boot.SpringApplication.run(SpringApplication.java:318)
native-query-error3-review-1  | 	at org.springframework.boot.SpringApplication.run(SpringApplication.java:1361)
native-query-error3-review-1  | 	at org.springframework.boot.SpringApplication.run(SpringApplication.java:1350)
native-query-error3-review-1  | 	at com.stillwaters.playground.microservices.core.review.ReviewServiceApplication.main(ReviewServiceApplication.java:45)
native-query-error3-review-1  | Caused by: java.lang.ExceptionInInitializerError
native-query-error3-review-1  | 	at org.springframework.orm.jpa.vendor.SpringHibernateJpaPersistenceProvider.createContainerEntityManagerFactory(SpringHibernateJpaPersistenceProvider.java:54)
native-query-error3-review-1  | 	at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:390)
native-query-error3-review-1  | 	at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFactory(AbstractEntityManagerFactoryBean.java:419)
native-query-error3-review-1  | 	at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:400)
native-query-error3-review-1  | 	at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.afterPropertiesSet(LocalContainerEntityManagerFactoryBean.java:366)
native-query-error3-review-1  | 	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1859)
native-query-error3-review-1  | 	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1808)
native-query-error3-review-1  | 	... 15 more
native-query-error3-review-1  | Caused by: java.lang.IllegalArgumentException: Invalid logger interface org.hibernate.internal.EntityManagerMessageLogger (implementation not found)
native-query-error3-review-1  | 	at org.jboss.logging.Logger.doGetMessageLogger(Logger.java:2630)
native-query-error3-review-1  | 	at org.jboss.logging.Logger.getMessageLogger(Logger.java:2570)
native-query-error3-review-1  | 	at org.jboss.logging.Logger.getMessageLogger(Logger.java:2552)
native-query-error3-review-1  | 	at org.hibernate.internal.HEMLogging.messageLogger(HEMLogging.java:28)
native-query-error3-review-1  | 	at org.hibernate.internal.HEMLogging.messageLogger(HEMLogging.java:24)
native-query-error3-review-1  | 	at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.<clinit>(EntityManagerFactoryBuilderImpl.java:144)
native-query-error3-review-1  | 	... 22 more
native-query-error3-review-1 exited with code 1

2. gradle build -x test :microservices:review-service:bootBuildImage &&
docker compose -f docker-compose-app-native.yml up

Application run failed
native-query-error3-review-1  | org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory': null
native-query-error3-review-1  | 	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1812)
native-query-error3-review-1  | 	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:601)
native-query-error3-review-1  | 	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:523)
native-query-error3-review-1  | 	at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:339)
native-query-error3-review-1  | 	at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:346)
native-query-error3-review-1  | 	at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:337)
native-query-error3-review-1  | 	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:207)
native-query-error3-review-1  | 	at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:970)
native-query-error3-review-1  | 	at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:627)
native-query-error3-review-1  | 	at org.springframework.boot.web.reactive.context.ReactiveWebServerApplicationContext.refresh(ReactiveWebServerApplicationContext.java:66)
native-query-error3-review-1  | 	at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:752)
native-query-error3-review-1  | 	at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:439)
native-query-error3-review-1  | 	at org.springframework.boot.SpringApplication.run(SpringApplication.java:318)
native-query-error3-review-1  | 	at org.springframework.boot.SpringApplication.run(SpringApplication.java:1361)
native-query-error3-review-1  | 	at org.springframework.boot.SpringApplication.run(SpringApplication.java:1350)
native-query-error3-review-1  | 	at com.stillwaters.playground.microservices.core.review.ReviewServiceApplication.main(ReviewServiceApplication.java:45)
native-query-error3-review-1  | Caused by: java.lang.ExceptionInInitializerError
native-query-error3-review-1  | 	at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.initiateService(JdbcEnvironmentInitiator.java:157)
native-query-error3-review-1  | 	at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.initiateService(JdbcEnvironmentInitiator.java:81)
native-query-error3-review-1  | 	at org.hibernate.boot.registry.internal.StandardServiceRegistryImpl.initiateService(StandardServiceRegistryImpl.java:130)
native-query-error3-review-1  | 	at org.hibernate.service.internal.AbstractServiceRegistryImpl.createService(AbstractServiceRegistryImpl.java:263)
native-query-error3-review-1  | 	at org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:238)
native-query-error3-review-1  | 	at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:215)
native-query-error3-review-1  | 	at org.hibernate.boot.model.relational.Database.<init>(Database.java:45)
native-query-error3-review-1  | 	at org.hibernate.boot.internal.InFlightMetadataCollectorImpl.getDatabase(InFlightMetadataCollectorImpl.java:226)
native-query-error3-review-1  | 	at org.hibernate.boot.internal.InFlightMetadataCollectorImpl.<init>(InFlightMetadataCollectorImpl.java:194)
native-query-error3-review-1  | 	at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.complete(MetadataBuildingProcess.java:171)
native-query-error3-review-1  | 	at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.metadata(EntityManagerFactoryBuilderImpl.java:1442)
native-query-error3-review-1  | 	at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:1513)
native-query-error3-review-1  | 	at org.springframework.orm.jpa.vendor.SpringHibernateJpaPersistenceProvider.createContainerEntityManagerFactory(SpringHibernateJpaPersistenceProvider.java:66)
native-query-error3-review-1  | 	at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:390)
native-query-error3-review-1  | 	at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFactory(AbstractEntityManagerFactoryBean.java:419)
native-query-error3-review-1  | 	at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:400)
native-query-error3-review-1  | 	at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.afterPropertiesSet(LocalContainerEntityManagerFactoryBean.java:366)
native-query-error3-review-1  | 	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1859)
native-query-error3-review-1  | 	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1808)
native-query-error3-review-1  | 	... 15 more
native-query-error3-review-1  | Caused by: java.lang.IllegalArgumentException: Invalid logger interface org.hibernate.internal.log.ConnectionInfoLogger (implementation not found)
native-query-error3-review-1  | 	at org.jboss.logging.Logger.doGetMessageLogger(Logger.java:2630)
native-query-error3-review-1  | 	at org.jboss.logging.Logger.getMessageLogger(Logger.java:2570)
native-query-error3-review-1  | 	at org.jboss.logging.Logger.getMessageLogger(Logger.java:2552)
native-query-error3-review-1  | 	at org.hibernate.internal.log.ConnectionInfoLogger.<clinit>(ConnectionInfoLogger.java:38)
native-query-error3-review-1  | 	... 34 more
native-query-error3-review-1 exited with code 1

Any help will be greatly appreciated.

@wilkinsona
Copy link
Member

wilkinsona commented Mar 11, 2025

That looks like a different error to the one reported in this issue. The provided sample also appears to be far from minimal as it includes multiple modules with numerous dependencies that are not related to a Hibernate problem.

To investigate your problem, I would start by using an up-to-date version of the org.graalvm.buildtools.native. If that doesn't help and you require further assistance, please ask a question on Stack Overflow that provides a truly minimal way to reproduce the problem.

@slowbreathing
Copy link

My bad, shall i make a new issue?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

6 participants
@wilkinsona @slowbreathing @spring-projects-issues @CROprogrammer @ahp-tams and others