quarkusio / quarkus

Quarkus: Supersonic Subatomic Java.
https://quarkus.io
Apache License 2.0
13.54k stars 2.61k forks source link

Jakarta Data requires Hibernate Dialect settings When Upgrading to 3.11.0 #40932

Closed hantsy closed 3 months ago

hantsy commented 3 months ago

Describe the bug

I tried to experience the new Jakarta Data feature shipped with the latest Hibernate 6.

The example project is here: https://github.com/hantsy/quarkus-sandbox/tree/master/jakarta-data which uses the latest stack:

besides the basic db-kind settings, I have to configure hibernate dialect quarkus.hibernate-orm.dialect=org.hibernate.dialect.PostgreSQLDialect to make it work.

Gavin King also confirmed this issue is introduced in the latest 3.11.0, https://hibernate.zulipchat.com/#narrow/stream/132096-hibernate-user/topic/SessionFacgory.20is.20null/near/441905256

Expected behavior

It should detect the dialect from db connection and db-kind settings as using hibernate-orm-panache module.

Actual behavior

If without this dialect line in the application.properties.

Run the application, it will throw exception like the following.

2024-05-31 21:09:49,346 ERROR [io.qua.run.boo.StartupActionImpl] (Quarkus Main Thread) Error running Quarkus: java.lang.reflect.InvocationTargetException
        at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:118)
        at java.base/java.lang.reflect.Method.invoke(Method.java:580)
        at io.quarkus.runner.bootstrap.StartupActionImpl$1.run(StartupActionImpl.java:113)
        at java.base/java.lang.Thread.run(Thread.java:1583)
Caused by: java.lang.ExceptionInInitializerError
        at java.base/jdk.internal.misc.Unsafe.ensureClassInitialized0(Native Method)
        at java.base/jdk.internal.misc.Unsafe.ensureClassInitialized(Unsafe.java:1160)
        at java.base/jdk.internal.reflect.MethodHandleAccessorFactory.ensureClassInitialized(MethodHandleAccessorFactory.java:300)
        at java.base/jdk.internal.reflect.MethodHandleAccessorFactory.newConstructorAccessor(MethodHandleAccessorFactory.java:103)
        at java.base/jdk.internal.reflect.ReflectionFactory.newConstructorAccessor(ReflectionFactory.java:200)
        at java.base/java.lang.reflect.Constructor.acquireConstructorAccessor(Constructor.java:549)
        at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:499)
        at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:486)
        at io.quarkus.runtime.Quarkus.run(Quarkus.java:70)
        at io.quarkus.runtime.Quarkus.run(Quarkus.java:44)
        at io.quarkus.runtime.Quarkus.run(Quarkus.java:124)
        at io.quarkus.runner.GeneratedMain.main(Unknown Source)
        at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103)
        ... 3 more
Caused by: java.lang.RuntimeException: Failed to start quarkus
        at io.quarkus.runner.ApplicationImpl.<clinit>(Unknown Source)
        ... 16 more
Caused by: org.hibernate.service.spi.ServiceException: Unable to create requested service [org.hibernate.engine.jdbc.env.spi.JdbcEnvironment] due to: Unable to determine Dialect without JDBC metadata (please set 'jakarta.persistence.jdbc.url' for common cases or 'hibernate.dialect' when a custom Dialect implementation must be provided)
        at org.hibernate.service.internal.AbstractServiceRegistryImpl.createService(AbstractServiceRegistryImpl.java:276)
        at org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:238)
        at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:215)
        at org.hibernate.boot.model.relational.Database.<init>(Database.java:45)
        at org.hibernate.boot.internal.InFlightMetadataCollectorImpl.getDatabase(InFlightMetadataCollectorImpl.java:221)
        at org.hibernate.boot.internal.InFlightMetadataCollectorImpl.<init>(InFlightMetadataCollectorImpl.java:189)
        at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.complete(MetadataBuildingProcess.java:171)
        at io.quarkus.hibernate.orm.runtime.boot.FastBootMetadataBuilder.build(FastBootMetadataBuilder.java:415)
        at io.quarkus.hibernate.orm.runtime.PersistenceUnitsHolder.createMetadata(PersistenceUnitsHolder.java:101)
        at io.quarkus.hibernate.orm.runtime.PersistenceUnitsHolder.constructMetadataAdvance(PersistenceUnitsHolder.java:73)
        at io.quarkus.hibernate.orm.runtime.PersistenceUnitsHolder.initializeJpa(PersistenceUnitsHolder.java:40)
        at io.quarkus.hibernate.orm.runtime.HibernateOrmRecorder$1.created(HibernateOrmRecorder.java:78)
        at io.quarkus.arc.runtime.ArcRecorder.initBeanContainer(ArcRecorder.java:79)
        at io.quarkus.deployment.steps.ArcProcessor$notifyBeanContainerListeners1304312071.deploy_0(Unknown Source)
        at io.quarkus.deployment.steps.ArcProcessor$notifyBeanContainerListeners1304312071.deploy(Unknown Source)
        ... 17 more
Caused by: org.hibernate.HibernateException: Unable to determine Dialect without JDBC metadata (please set 'jakarta.persistence.jdbc.url' for common cases or 'hibernate.dialect' when a custom Dialect implementation must be provided)        at org.hibernate.engine.jdbc.dialect.internal.DialectFactoryImpl.determineDialect(DialectFactoryImpl.java:191)
        at org.hibernate.engine.jdbc.dialect.internal.DialectFactoryImpl.buildDialect(DialectFactoryImpl.java:87)
        at io.quarkus.hibernate.orm.runtime.service.QuarkusStaticInitDialectFactory.buildDialect(QuarkusStaticInitDialectFactory.java:25)
        at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.getJdbcEnvironmentWithDefaults(JdbcEnvironmentInitiator.java:156)
        at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.initiateService(JdbcEnvironmentInitiator.java:148)
        at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.initiateService(JdbcEnvironmentInitiator.java:76)
        at org.hibernate.boot.registry.internal.StandardServiceRegistryImpl.initiateService(StandardServiceRegistryImpl.java:130)
        at org.hibernate.service.internal.AbstractServiceRegistryImpl.createService(AbstractServiceRegistryImpl.java:263)
        ... 31 more

2024-05-31 21:09:49,414 INFO  [io.qua.dep.dev.IsolatedDevModeMain] (main) Attempting to start live reload endpoint to recover from previous Quarkus startup failure

How to Reproduce?

  1. Clone https://github.com/hantsy/quarkus-sandbox/tree/master/jakarta-data
  2. Comment out the line quarkus.hibernate-orm.dialect=org.hibernate.dialect.PostgreSQLDialect in the application.properties
  3. Run the application in dev mode, or run tests.

Output of uname -a or ver

Windows 10

Output of java -version

21

Quarkus version or git rev

3.11.0

Build tool (ie. output of mvnw --version or gradlew --version)

3.9.7

Additional information

No response

quarkus-bot[bot] commented 3 months ago

/cc @gsmet (hibernate-orm), @yrodiere (hibernate-orm)

yrodiere commented 3 months ago

Hey,

Hibernate ORM 6.6.0.Alpha1/Jakarta Data 1.0 RC1

There is tight coupling between the Hibernate ORM extension in Quarkus and Hibernate ORM, which makes version overrides impossible without updating the Hibernate ORM extension in Quarkus.

I checked, and with your reproducer, the problem doesn't happen with Hibernate ORM 6.5.2 -- aka "the version of Hibernate ORM that Quarkus 3.11 is intended to work with".

My guess would be that some fixes in Hibernate ORM 6.5.1/6.5.2 are not part of Hibernate ORM 6.6 yet -- given it's only an Alpha1, and a lot of fixes have been merged since this alpha but haven't been released as part of the 6.6 stream yet.

I'll close this for now, feel free to reopen if the problem is still there with Hibernate ORM 6.6.0.Alpha2.