In a Spring Boot 3.0.0-RC2 compiled Native image when an entity is loaded without prefetching the lazy self joined parent entity the following exception occurs:
org.hibernate.HibernateException: Generation of HibernateProxy instances at runtime is not allowed when the configured BytecodeProvider is 'none'; your model requires a more advanced BytecodeProvider to be enabled.
at org.hibernate.bytecode.internal.none.DisallowedProxyFactory.getProxy(DisallowedProxyFactory.java:34) ~[na:na]
at org.hibernate.persister.entity.AbstractEntityPersister.createProxy(AbstractEntityPersister.java:4935) ~[com.example.demo.DemoApplication:6.1.5.Final]
at org.hibernate.event.internal.DefaultLoadEventListener.createProxy(DefaultLoadEventListener.java:465) ~[na:na]
at org.hibernate.event.internal.DefaultLoadEventListener.createProxyIfNecessary(DefaultLoadEventListener.java:455) ~[na:na]
at org.hibernate.event.internal.DefaultLoadEventListener.proxyOrLoad(DefaultLoadEventListener.java:357) ~[na:na]
at org.hibernate.event.internal.DefaultLoadEventListener.doOnLoad(DefaultLoadEventListener.java:113) ~[na:na]
at org.hibernate.event.internal.DefaultLoadEventListener.onLoad(DefaultLoadEventListener.java:75) ~[na:na]
at org.hibernate.event.service.internal.EventListenerGroupImpl.fireEventOnEachListener(EventListenerGroupImpl.java:118) ~[com.example.demo.DemoApplication:6.1.5.Final]
at org.hibernate.internal.SessionImpl.fireLoadNoChecks(SessionImpl.java:1241) ~[na:na]
at org.hibernate.internal.SessionImpl.internalLoad(SessionImpl.java:1094) ~[na:na]
at org.hibernate.sql.results.graph.entity.internal.EntityDelayedFetchInitializer.resolveInstance(EntityDelayedFetchInitializer.java:158) ~[na:na]
at org.hibernate.sql.results.internal.StandardRowReader.coordinateInitializers(StandardRowReader.java:148) ~[na:na]
at org.hibernate.sql.results.internal.StandardRowReader.readRow(StandardRowReader.java:98) ~[na:na]
at org.hibernate.sql.results.spi.ListResultsConsumer.consume(ListResultsConsumer.java:143) ~[na:na]
at org.hibernate.sql.results.spi.ListResultsConsumer.consume(ListResultsConsumer.java:32) ~[na:na]
at org.hibernate.sql.exec.internal.JdbcSelectExecutorStandardImpl.doExecuteQuery(JdbcSelectExecutorStandardImpl.java:443) ~[na:na]
at org.hibernate.sql.exec.internal.JdbcSelectExecutorStandardImpl.executeQuery(JdbcSelectExecutorStandardImpl.java:166) ~[na:na]
at org.hibernate.sql.exec.internal.JdbcSelectExecutorStandardImpl.list(JdbcSelectExecutorStandardImpl.java:91) ~[na:na]
at org.hibernate.sql.exec.spi.JdbcSelectExecutor.list(JdbcSelectExecutor.java:31) ~[com.example.demo.DemoApplication:6.1.5.Final]
at org.hibernate.loader.ast.internal.SingleIdLoadPlan.load(SingleIdLoadPlan.java:140) ~[com.example.demo.DemoApplication:6.1.5.Final]
at org.hibernate.loader.ast.internal.SingleIdLoadPlan.load(SingleIdLoadPlan.java:110) ~[com.example.demo.DemoApplication:6.1.5.Final]
at org.hibernate.loader.ast.internal.SingleIdEntityLoaderStandardImpl.load(SingleIdEntityLoaderStandardImpl.java:72) ~[na:na]
at org.hibernate.persister.entity.AbstractEntityPersister.doLoad(AbstractEntityPersister.java:4325) ~[com.example.demo.DemoApplication:6.1.5.Final]
at org.hibernate.persister.entity.AbstractEntityPersister.load(AbstractEntityPersister.java:4315) ~[com.example.demo.DemoApplication:6.1.5.Final]
at org.hibernate.event.internal.DefaultLoadEventListener.loadFromDatasource(DefaultLoadEventListener.java:599) ~[na:na]
at org.hibernate.event.internal.DefaultLoadEventListener.doLoad(DefaultLoadEventListener.java:572) ~[na:na]
at org.hibernate.event.internal.DefaultLoadEventListener.load(DefaultLoadEventListener.java:224) ~[na:na]
at org.hibernate.event.internal.DefaultLoadEventListener.proxyOrLoad(DefaultLoadEventListener.java:363) ~[na:na]
at org.hibernate.event.internal.DefaultLoadEventListener.doOnLoad(DefaultLoadEventListener.java:113) ~[na:na]
at org.hibernate.event.internal.DefaultLoadEventListener.onLoad(DefaultLoadEventListener.java:75) ~[na:na]
at org.hibernate.event.service.internal.EventListenerGroupImpl.fireEventOnEachListener(EventListenerGroupImpl.java:118) ~[com.example.demo.DemoApplication:6.1.5.Final]
at org.hibernate.internal.SessionImpl.fireLoadNoChecks(SessionImpl.java:1241) ~[na:na]
at org.hibernate.internal.SessionImpl.fireLoad(SessionImpl.java:1229) ~[na:na]
at org.hibernate.loader.access.IdentifierLoadAccessImpl.doLoad(IdentifierLoadAccessImpl.java:192) ~[na:na]
at org.hibernate.loader.access.IdentifierLoadAccessImpl.lambda$load$1(IdentifierLoadAccessImpl.java:158) ~[na:na]
at org.hibernate.loader.access.IdentifierLoadAccessImpl.perform(IdentifierLoadAccessImpl.java:105) ~[na:na]
at org.hibernate.loader.access.IdentifierLoadAccessImpl.load(IdentifierLoadAccessImpl.java:158) ~[na:na]
at org.hibernate.internal.SessionImpl.find(SessionImpl.java:2335) ~[na:na]
at org.hibernate.internal.SessionImpl.find(SessionImpl.java:2302) ~[na:na]
at java.base@17.0.5/java.lang.reflect.Method.invoke(Method.java:568) ~[com.example.demo.DemoApplication:na]
at org.springframework.orm.jpa.ExtendedEntityManagerCreator$ExtendedEntityManagerInvocationHandler.invoke(ExtendedEntityManagerCreator.java:360) ~[na:na]
at jdk.proxy4/jdk.proxy4.$Proxy52.find(Unknown Source) ~[na:na]
at java.base@17.0.5/java.lang.reflect.Method.invoke(Method.java:568) ~[com.example.demo.DemoApplication:na]
at org.springframework.orm.jpa.SharedEntityManagerCreator$SharedEntityManagerInvocationHandler.invoke(SharedEntityManagerCreator.java:311) ~[na:na]
at jdk.proxy4/jdk.proxy4.$Proxy52.find(Unknown Source) ~[na:na]
at org.springframework.data.jpa.repository.support.SimpleJpaRepository.findById(SimpleJpaRepository.java:313) ~[com.example.demo.DemoApplication:na]
I've put together a sample project to reproduce the issue, all 4 endpoints work fine running in JVM, only the ones with prefetching work in the Native image.
Comment From: snicoll
Thanks for the report but the Hibernate enhance plugin is not configured on that sample project. This issue does not seem to be related to Spring Boot. You can generate a project on start.spring.io with "GraalVM Native Support" and "Spring Data JPA" if you need more information.
Comment From: vgaborabs
You're absolutely right, sorry to have bothered you with my amateur hour.