Skip to content
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

Native compilation with @GenericGenerator custom strategy #34737

Closed
dviel opened this issue Mar 23, 2023 · 3 comments
Closed

Native compilation with @GenericGenerator custom strategy #34737

dviel opened this issue Mar 23, 2023 · 3 comments
Labels
for: external-project For an external project and not something we can fix status: invalid An issue that we don't feel is valid

Comments

@dviel
Copy link

dviel commented Mar 23, 2023

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

@spring-projects-issues spring-projects-issues added the status: waiting-for-triage An issue we've not yet triaged label Mar 23, 2023
@wilkinsona
Copy link
Member

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.

@wilkinsona wilkinsona closed this as not planned Won't fix, can't repro, duplicate, stale Mar 23, 2023
@wilkinsona wilkinsona added status: invalid An issue that we don't feel is valid for: external-project For an external project and not something we can fix and removed status: waiting-for-triage An issue we've not yet triaged labels Mar 23, 2023
@dviel
Copy link
Author

dviel commented Mar 23, 2023

Finally find the fix :)

@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()));
        }
    }
}

@wilkinsona
Copy link
Member

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?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
for: external-project For an external project and not something we can fix status: invalid An issue that we don't feel is valid
Projects
None yet
Development

No branches or pull requests

3 participants