Hibernate-reactive: 增强 - 与 spring @Transactional 注释集成

创建于 2021-05-20  ·  16评论  ·  资料来源: hibernate/hibernate-reactive

你好,

我们正在对 hibernate reactive 进行持续评估,以取代我们当前由 postgres-db+spring boot+spring data+r2dbc 组成的软件软件。 我们在使用 r2dbc 时遇到了很多限制,我们希望重用我们已经拥有的关于 Hibernate 的大量知识。
我们几乎重构了一个完整的微服务,重新编写了我们自己的 spring-data(通用存储库),它看起来非常好。

开发人员提出的主要问题之一是使用声明式事务管理(使用注释)而不是编程的选项。

我们知道,实现这种机制并不是 Hibernate 响应式的目的,而是与 Hibernate 集成的框架(Spring、Quarkus ......),就像为标准 Hibernate 所做的那样。 即使我们想自己做,Hibernate 响应式中的事务 API 也与标准的 Hibernate API 不同,并且没有与事务管理器交互的 API。

如果我们能得到您对此的评论(如果您能获得更多评论,我会很高兴 :smiley:),并且如果您仍然认为我们可以提出一般准则,因为我们目前不知道该怎么做。
谢谢

problem

所有16条评论

好吧,我想 Spring 有某种拦截器概念,您可以在其中使用注释将拦截器绑定到 bean 方法调用。 如果您从这样的拦截器中调用withTransaction() ,然后委托给 bean 方法,这就是声明性事务管理的全部内容。 真的应该只有几行代码。 (至少它会在 CDI 中,我对春天不太确定。)

唯一的微妙之处是您需要一种方法来检测是否有事务已经绑定到当前的反应流。 在我们的堆栈中,这将使用 MP Contexts 完成。 不知道在春天的土地上是怎么做到的。

(OTOH,如果您询问如何与 XA 事务管理器集成,那么,这是完全不同的蠕虫罐头,现在对反应式驱动程序并不实用。我们还没有任何真正的反应式事务管理人员。)

现在,我们不需要分布式事务

然后调用SessionFactory.withTransaction()的拦截器应该可以正常工作。

将尝试这种方式并更新。 谢谢

@gavinking看起来Spring使用Aspect实现了@Transactional 。 它并不是真的那么重要,但对我们来说实现起来也可能更简单。
但我认为只有在 Stage 类中公开 openTransaction() commitTransaction() 和 rollbackTransaction() 的 API 时,我们才能做到这一点,因为我们有 openSession() 和 closeSession() API。 我觉得事务对象是需要的,withTransaction 是不够的。
是否有意义 ?

应该有某种“环绕”拦截器的概念,它可以让您包装并转发到该方法。

(确实,你不能在拦截器之前/之后做到这一点。)

我认为是这个: https ://howtodoinjava.com/spring-aop/aspectj-around-annotation-example/

@gavinking您能否详细说明您在“在我们的堆栈中将使用 MP 上下文完成”之前写的内容。 检查一个事务是否已经绑定在当前流中? 您能否参考编写的代码或测试。 会话也一样,我怎么知道会话已经在当前流中打开。
谢谢。

看,我不知道你在春天是怎么做到的。 您需要某种类似于 threadlocal 的构造,但是本地绑定到当前的反应流而不是线程。 我敢肯定他们一定有什么。

我目前不打算使用 spring @Transactional ,而是实现我们自己的事务注释以避免对 Spring 过于深入。 所以我之前的问题与您的句子“在我们的堆栈中将使用 MP 上下文完成”有关。

“我们的堆栈”== Quarkus。

我是说你必须在 Spring 环境中找到类似的东西。

因为如果你不能将值绑定到当前的反应流,那么你就不能拥有声明性事务,就这么简单,你只需要“手动”管理事务。 (通过调用withTransaction()实际上非常简单。我真的不明白为什么人们认为他们需要注释。)

但我确信必须有某种方法可以做到这一点。 你只是问错人了。

结束:被 #782 取代。

@yaakov-berkovitch 加上我用#779 放置的东西,你应该更容易实现它。

@gavinking谢谢!!

此页面是否有帮助?
0 / 5 - 0 等级