• 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?