java 在一个项目中使用Hibernate-Reactive和R2 DBC

o2gm4chl  于 2024-01-05  发布在  Java
关注(0)|答案(3)|浏览(184)

我目前正在做一个使用Spring-Webflux和R2 DBC的项目。我正在使用OracleDB 19 c和R2 DBC的相应驱动程序。由于Hibernate是响应式的,我想在现有的项目中尝试它-所以它需要在R2 DBC旁边运行(对于Hibernate,我使用vertx-oracle)。但是当启动应用程序时,我得到ClassNotFoundError:

  1. Exception in thread "main" java.lang.NoClassDefFoundError: org/hibernate/engine/jdbc/mutation/spi/MutationExecutorService
  2. at org.hibernate.reactive.provider.impl.ReactiveServiceInitiators.buildInitialServiceInitiatorList(ReactiveServiceInitiators.java:122)
  3. at org.hibernate.reactive.provider.impl.ReactiveServiceInitiators.<clinit>(ReactiveServiceInitiators.java:60)
  4. at org.hibernate.reactive.provider.ReactiveServiceRegistryBuilder.defaultReactiveInitiatorList(ReactiveServiceRegistryBuilder.java:135)
  5. at org.hibernate.reactive.provider.ReactiveServiceRegistryBuilder.forJpa(ReactiveServiceRegistryBuilder.java:46)
  6. at org.hibernate.reactive.provider.impl.ReactiveEntityManagerFactoryBuilder.getStandardServiceRegistryBuilder(ReactiveEntityManagerFactoryBuilder.java:39)
  7. at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.<init>(EntityManagerFactoryBuilderImpl.java:249)
  8. at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.<init>(EntityManagerFactoryBuilderImpl.java:189)
  9. at org.hibernate.reactive.provider.impl.ReactiveEntityManagerFactoryBuilder.<init>(ReactiveEntityManagerFactoryBuilder.java:33)
  10. at org.hibernate.reactive.provider.ReactivePersistenceProvider.getEntityManagerFactoryBuilder(ReactivePersistenceProvider.java:151)
  11. at org.hibernate.reactive.provider.ReactivePersistenceProvider.getEntityManagerFactoryBuilderOrNull(ReactivePersistenceProvider.java:102)
  12. at org.hibernate.reactive.provider.ReactivePersistenceProvider.createEntityManagerFactory(ReactivePersistenceProvider.java:50)
  13. at jakarta.persistence.Persistence.createEntityManagerFactory(Persistence.java:80)
  14. at jakarta.persistence.Persistence.createEntityManagerFactory(Persistence.java:55)
  15. at org.hibernate.reactive.example.nativesql.Main.main(Main.java:38)
  16. Caused by: java.lang.ClassNotFoundException: org.hibernate.engine.jdbc.mutation.spi.MutationExecutorService
  17. at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:641)
  18. at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188)
  19. at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:520)
  20. ... 14 more
  21. Process finished with exit code 1

字符串
似乎不是所有需要的类都是通过hibernate-reactive-core(2.2.0.Final)依赖来交付的。我在文档中遗漏了什么吗?或者这是某种意外的行为?
我尝试通过添加依赖项来导入缺少的MutationExecutorService接口

  1. <dependency>
  2. <groupId>org.hibernate.orm</groupId>
  3. <artifactId>hibernate-core</artifactId>
  4. <version>6.4.0.Final</version>
  5. </dependency>


这个类被导入了,但是我在运行Hibernate和R2 DBC时遇到了问题,这导致了我试图打开的每个休眠会话的连接超时。
我还尝试使用hibernate-reactive examples中给定的最小项目,具有更少的依赖性,即使这样,我也面对java.lang.ClassNotFoundException: org.hibernate.engine.jdbc.mutation.spi.MutationExecutorService,所以这不应该是由R2 DBC引起的。
你有在一个项目中使用hibernate-reactive和R2 DBC的经验和建议吗?缺少类是正常的行为还是这是一个不应该发生的错误?

编辑我尝试了[https://stackoverflow.com/a/77620095/23052670)[Davide D 'Alto]推荐的依赖(hibernate-core 6.3.2.Final + hibernate-reactive-core 2.1.0.Final)。

我仍然得到一个Spring启动冻结几秒钟,然后响应包含一个错误的错误日志。

Edit 2即使我自己在@Configuration类中准备了一个SessionFactory-Bean,我在启动应用程序时也会超时。

无法创建请求的服务[org.hibernate.engine.jdbc.env.spi.JdbcEnvironment],原因如下:io.vertx.core.impl.NoStackTraceThrowable:
这是vertx-oracle的一个普遍问题吗?我在网上找到了vertx-postgres的例子,但没有oracle。

  • 编辑3*

我设法连接到版本为21.3c的OracleDB(也是Docker容器)。但仍收到错误:WARN vert.x-eventloop-thread-0 org.hibernate.reactive.provider.service.ReactiveGenerationTarget HR 00021:SQL命令失败[java.lang.NoClassDefFoundError:oracle/jdbc/OracleCommonPreparedStatement] 因此查询对数据库没有影响。
我能够使用com.oracle.databas.jdbc.ojdbc11-23.2.0.0的依赖项再次修复该问题。

mzaanser

mzaanser1#

出现这些问题的原因是因为项目中的库需要不同的Hibernate ORM版本。
我不熟悉R2DBC,你应该检查它需要哪个依赖,然后包括正确的Hibernate Reactive版本。它可能是Hibernate Reactive 2.1.0.Final(与Hibernate ORM 6.3.2.Final兼容)。但你可以检查Hibernate website上的版本兼容性。

b5buobof

b5buobof2#

我弄清楚了如何用OracleDB运行它。我采取了以下步骤:
1.看起来Hibernate-Reactive目前与OracleDB 19 c不兼容。使用版本21 c解决了问题(因此在这一点上应该认真对待“测试”within project-README
1.虽然可以连接到数据库,但我无法写入数据库(至少在启动时自动生成)。这可以通过在我的pom.xml中添加以下依赖项来解决:

  1. <dependency>
  2. <groupId>com.oracle.database.jdbc</groupId>
  3. <artifactId>ojdbc11</artifactId>
  4. <version>23.2.0.0</version>
  5. </dependency>

字符串
在这些步骤之后,连接建立并且自动生成工作。

vawmfj5a

vawmfj5a3#

到目前为止(Spring 6.1和Sping Boot 3.2),Spring和Sping Boot 中还没有官方的Hibernate Reactive支持。
如果你想将Hibernate Reactive与Spring,特别是Spring Reactive堆栈(WebFlux)集成,这并不难,只需要一些简单的步骤来配置它。
1.将Hibernate core和Hibernate Reactive deps添加到Spring Reactive项目中。
1.声明一个基于Java 8 CompletableFuture或基于Smallrye Mutiny的会话工厂Bean。
1.在你的项目中使用它来执行JPQL,就像使用通用的Hibernate Session或JPA会话管理器一样。
更多详情,请阅读我的帖子:https://itnext.io/integrating-hibernate-reactive-with-spring-5427440607fe
R2 dbc是一个相对较新的RDBMS驱动程序,目前大多数流行的数据库都增加了对R2 dbc的支持,但Hibernate Reactive实现是基于Vertx的Reactive驱动程序,与R2 dbc没有关系。
您可以在Spring WebFlux中自由使用R2 dbc,无论是否使用Hibernate Reactive。
这里有一些来自我的Github的R2 dbc/Spring Data R2 dbc示例项目:https://github.com/hantsy/spring-r2dbc-sample

更新:我用Sping Boot 3.2、Hibernate 6.4.1/Hibernate Reactive 2.2.0.Final(带有Vertx pg客户端)和Spring Data R2 dbc(带有r2 dbc postgres驱动程序)创建了一个简单的工作项目,https://github.com/hantsy/spring-puzzles/tree/master/hibernate-reactive-mutiny-r2dbc
更新2,Oracle https://github.com/hantsy/spring-puzzles/tree/master/hibernate-reactive-mutiny-oracle的工作示例

相关问题