- Spring boot version 3.0.4
- Java : OpenJDK Runtime Environment GraalVM CE 22.3.1 (build 19.0.2+7-jvmci-22.3-b12)
- Os : OSX 13.2.1 (22D68)
- Arch : Apple Silicon M1
I'm setting on my Object a custom Id generator strategy
@Entity
@Table(name = "users")
@Data
@NoArgsConstructor
@AllArgsConstructor
public class User {
@Id
@GeneratedValue(generator = "mwuuid")
@GenericGenerator(name = "mwuuid", strategy = "com.exemple.demo.JdkUUIDIdentifierGenerator")
@Column(length = 32)
//@GeneratedValue(strategy= GenerationType.AUTO)
private String id;
private String name;
public User(String name) {
this.name = name;
}
}
The native compilation works well but on execution I have got this exception 👍
. ____ _ __ _ _
/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
\\/ ___)| |_)| | | | | || (_| | ) ) ) )
' |____| .__|_| |_|_| |_\__, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot :: (v3.0.4)
2023-03-23T15:21:43.685+01:00 INFO 67666 --- [ main] com.example.demo.Demoh2Application : Starting AOT-processed Demoh2Application using Java 19.0.2 with PID 67666 (/Users/demo/Desktop/demo 2/target/demo started by dams in /Users/dams/Desktop/demo 2)
2023-03-23T15:21:43.685+01:00 INFO 67666 --- [ main] com.example.demo.Demoh2Application : No active profile set, falling back to 1 default profile: "default"
2023-03-23T15:21:43.704+01:00 INFO 67666 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 8080 (http)
2023-03-23T15:21:43.705+01:00 INFO 67666 --- [ main] o.apache.catalina.core.StandardService : Starting service [Tomcat]
2023-03-23T15:21:43.705+01:00 INFO 67666 --- [ main] o.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/10.1.5]
2023-03-23T15:21:43.711+01:00 INFO 67666 --- [ main] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext
2023-03-23T15:21:43.711+01:00 INFO 67666 --- [ main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 25 ms
2023-03-23T15:21:43.722+01:00 INFO 67666 --- [ main] o.hibernate.jpa.internal.util.LogHelper : HHH000204: Processing PersistenceUnitInfo [name: default]
2023-03-23T15:21:43.724+01:00 INFO 67666 --- [ main] org.hibernate.Version : HHH000412: Hibernate ORM core version 6.1.7.Final
2023-03-23T15:21:43.728+01:00 INFO 67666 --- [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Starting...
2023-03-23T15:21:43.733+01:00 INFO 67666 --- [ main] com.zaxxer.hikari.pool.HikariPool : HikariPool-1 - Added connection conn0: url=jdbc:h2:file:./db user=SA
2023-03-23T15:21:43.733+01:00 INFO 67666 --- [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Start completed.
2023-03-23T15:21:43.733+01:00 INFO 67666 --- [ main] SQL dialect : HHH000400: Using dialect: org.hibernate.dialect.H2Dialect
2023-03-23T15:21:43.738+01:00 ERROR 67666 --- [ main] j.LocalContainerEntityManagerFactoryBean : Failed to initialize JPA EntityManagerFactory: [PersistenceUnit: default] Unable to build Hibernate SessionFactory; nested exception is org.hibernate.MappingException: Could not instantiate id generator [entity-name=com.example.demo.User]
2023-03-23T15:21:43.738+01:00 WARN 67666 --- [ main] w.s.c.ServletWebServerApplicationContext : Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory': [PersistenceUnit: default] Unable to build Hibernate SessionFactory; nested exception is org.hibernate.MappingException: Could not instantiate id generator [entity-name=com.example.demo.User]
2023-03-23T15:21:43.738+01:00 INFO 67666 --- [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Shutdown initiated...
2023-03-23T15:21:43.750+01:00 INFO 67666 --- [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Shutdown completed.
2023-03-23T15:21:43.750+01:00 INFO 67666 --- [ main] o.apache.catalina.core.StandardService : Stopping service [Tomcat]
2023-03-23T15:21:43.751+01:00 ERROR 67666 --- [ main] o.s.boot.SpringApplication : Application run failed
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory': [PersistenceUnit: default] Unable to build Hibernate SessionFactory; nested exception is org.hibernate.MappingException: Could not instantiate id generator [entity-name=com.example.demo.User]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1762) ~[demo:6.0.6]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:599) ~[demo:6.0.6]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:521) ~[demo:6.0.6]
at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:326) ~[demo:6.0.6]
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) ~[demo:6.0.6]
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:324) ~[demo:6.0.6]
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:200) ~[demo:6.0.6]
at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1132) ~[demo:6.0.6]
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:907) ~[demo:6.0.6]
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:584) ~[demo:6.0.6]
at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:146) ~[demo:3.0.4]
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:732) ~[demo:3.0.4]
at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:434) ~[demo:3.0.4]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:310) ~[demo:3.0.4]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1304) ~[demo:3.0.4]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1293) ~[demo:3.0.4]
at com.example.demo.Demoh2Application.main(Demoh2Application.java:17) ~[demo:na]
Caused by: jakarta.persistence.PersistenceException: [PersistenceUnit: default] Unable to build Hibernate SessionFactory; nested exception is org.hibernate.MappingException: Could not instantiate id generator [entity-name=com.example.demo.User]
at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFactory(AbstractEntityManagerFactoryBean.java:421) ~[demo:6.0.6]
at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:396) ~[demo:6.0.6]
at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.afterPropertiesSet(LocalContainerEntityManagerFactoryBean.java:352) ~[demo:6.0.6]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1808) ~[demo:6.0.6]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1758) ~[demo:6.0.6]
... 16 common frames omitted
Caused by: org.hibernate.MappingException: Could not instantiate id generator [entity-name=com.example.demo.User]
at org.hibernate.id.factory.internal.StandardIdentifierGeneratorFactory.createIdentifierGenerator(StandardIdentifierGeneratorFactory.java:222) ~[na:na]
at org.hibernate.mapping.SimpleValue.createIdentifierGenerator(SimpleValue.java:515) ~[demo:6.1.7.Final]
at org.hibernate.mapping.SimpleValue.createIdentifierGenerator(SimpleValue.java:372) ~[demo:6.1.7.Final]
at org.hibernate.internal.SessionFactoryImpl.lambda$new$1(SessionFactoryImpl.java:293) ~[demo:6.1.7.Final]
at java.base@19.0.2/java.util.stream.ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:183) ~[na:na]
at java.base@19.0.2/java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:179) ~[na:na]
at java.base@19.0.2/java.util.HashMap$ValueSpliterator.forEachRemaining(HashMap.java:1787) ~[na:na]
at java.base@19.0.2/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:509) ~[demo:na]
at java.base@19.0.2/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499) ~[demo:na]
at java.base@19.0.2/java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:150) ~[demo:na]
at java.base@19.0.2/java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:173) ~[na:na]
at java.base@19.0.2/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234) ~[demo:na]
at java.base@19.0.2/java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:596) ~[demo:na]
at org.hibernate.internal.SessionFactoryImpl.<init>(SessionFactoryImpl.java:292) ~[demo:6.1.7.Final]
at org.hibernate.boot.internal.SessionFactoryBuilderImpl.build(SessionFactoryBuilderImpl.java:415) ~[demo:6.1.7.Final]
at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:1423) ~[demo:6.1.7.Final]
at org.springframework.orm.jpa.vendor.SpringHibernateJpaPersistenceProvider.createContainerEntityManagerFactory(SpringHibernateJpaPersistenceProvider.java:66) ~[na:na]
at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:376) ~[demo:6.0.6]
at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFactory(AbstractEntityManagerFactoryBean.java:409) ~[demo:6.0.6]
... 20 common frames omitted
Caused by: org.hibernate.MappingException: Could not interpret id generator strategy [com.exemple.demo.JdkUUIDIdentifierGenerator]
at org.hibernate.id.factory.internal.StandardIdentifierGeneratorFactory.getIdentifierGeneratorClass(StandardIdentifierGeneratorFactory.java:253) ~[na:na]
at org.hibernate.id.factory.internal.StandardIdentifierGeneratorFactory.createIdentifierGenerator(StandardIdentifierGeneratorFactory.java:200) ~[na:na]
... 38 common frames omitted
Missing Hints ?
Comment From: wilkinsona
Yes. Spring Framework could generate such a hint for you automatically. PersistenceManagedTypesBeanRegistrationAotProcessor already registers various hints for custom callbacks, converters, and the like. It could do the same for custom generators. Please open a Spring Framework issue and link to it from here.
Comment From: dviel
Finally find the fix :)
```java @Configuration @ImportRuntimeHints(HibernateRuntimeHints.HibernateRegistrar.class) public class HibernateRuntimeHints { static class HibernateRegistrar implements RuntimeHintsRegistrar { @Override public void registerHints(RuntimeHints hints, ClassLoader classLoader) { hints.reflection() .registerTypes( Arrays.asList( TypeReference.of(JdkUUIDIdentifierGenerator.class), TypeReference.of(PhysicalNamingStrategyStandardImpl.class), TypeReference.of(ImplicitNamingStrategyLegacyJpaImpl.class) ), builder -> builder.withMembers(MemberCategory.values())); } } } ````
Comment From: wilkinsona
Thanks for sharing the fix, @dviel. Have you had a chance to open a Framework issue so that it won't be needed in the future?