Hibernate-reactive: 拡張-Spring@Transactionalアノテーションとの統合

作成日 2021年05月20日  ·  16コメント  ·  ソース: hibernate/hibernate-reactive

やあ、

postgres-db + spring boot + spring data + r2dbcで構成される現在のソフトウェアソフトウェアを置き換えるために、Hibernateリアクティブの継続的な評価を行っています。 r2dbcを使用することで多くの制限に直面し、Hibernateに関してすでに持っている豊富な知識を再利用したいと考えました。
ほぼ完全なマイクロサービスをリファクタリングし、独自のスプリングデータ(汎用リポジトリ)を書き直しましたが、非常に見栄えがします。

開発者が提起している主要な問題の1つは、プログラムではなく宣言型トランザクション管理(アノテーションを使用)を使用するオプションです。

このようなメカニズムを実装することがHibernateリアクティブの目的ではなく、標準のHibernateで行われたように、Hibernateと統合するフレームワーク(Spring、Quarkus ...)に対応することがわかっています。 自分で実行したい場合でも、HibernateリアクティブのトランザクションAPIは標準のHibernate APIと同じではなく、トランザクションマネージャーと対話するためのAPIはありません。

これについてコメントをいただければ幸いです(そして、:smiley :)ができればさらに多くのコメントをいただければ幸いです。それでも、現在のところ方法がわからないため、一般的なガイドラインを提案することができます。
ありがとう

problem

全てのコメント16件

Springには、アノテーションを使用してインターセプターをBeanメソッド呼び出しにバインドできる、ある種のインターセプターの概念があると思います。 そのようなインターセプター内からwithTransaction()を呼び出してから、Beanメソッドに委任する場合、これがすべて宣言型のトランザクション管理です。 実際には、ほんの数行のコードである必要があります。 (少なくともそれはCDIにあるでしょう、私は春についてあまり確信がありません。)

唯一の微妙な点は、現在のリアクティブストリームにすでにバインドされているトランザクションがあるかどうかを検出する方法が必要なことです。 スタックでは、MPコンテキストを使用して実行されます。 それが春の土地でどのように行われるのか分かりません。

(OTOH XAトランザクションマネージャーと統合する方法について質問している場合、それはまったく異なるワームの缶であり、現時点ではリアクティブドライバーでは実際には実用的ではありません。本当にリアクティブなトランザクションはまだありません。マネージャー。)

現在、分散トランザクションは必要ありません

次に、 SessionFactory.withTransaction()を呼び出すインターセプターが正常に機能するはずです。

この方法を試して更新します。 ありがとう

@gavinking Springは、アスペクトを使用して@Transactionalを実装しているようです。 それほど重要ではありませんが、実装するのも簡単かもしれません。
ただし、openSession()およびcloseSession()APIがあるため、StageクラスでopenTransaction()commitTransaction()およびrollbackTransaction()のAPIを公開する場合にのみそれを行うことはできないと思います。 トランザクションオブジェクトが必要であり、withTransactionでは不十分だと思います。
それは意味がありますか?

メソッドをラップして転送できる「アラウンド」インターセプターのある種の概念があるはずです。

(インターセプターの前後ではできないのは事実です。)

私はこれだと思います: https ://howtodoinjava.com/spring-aop/aspectj-around-annotation-example/

@gavinkingは、「MPコンテキストを使用して行われるスタックで」の前に書いたことについて詳しく説明していただけますか。 トランザクションが現在のストリームにすでにバインドされているかどうかを確認するには? コード、または作成されたテストを参照できますか。 セッションについても同じですが、セッションが現在のストリームですでに開いていることをどのように理解できますか。
ありがとう。

ほら、春にどうやってそれをするのかわからない。 スレッドローカルのような構造が必要ですが、スレッドではなく現在のリアクティブストリームにローカルバインドされています。 彼らは何かを持っているに違いないと確信しています。

現在、spring @Transactionalは使用しませんが、Springに深く入りすぎないように、独自のトランザクションアノテーションを実装します。 したがって、私の前の質問は、「MPコンテキストを使用して実行されるスタック内」という文に関連していました。

「私たちのスタック」==Quarkus。

春の環境で似たようなものを見つけなければならないと言っています。

値を現在のリアクティブストリームにバインドできない場合、そのように単純な宣言型トランザクションを作成することはできず、トランザクションを「手動で」管理する必要があるためです。 (これは、 withTransaction()を呼び出すだけで、実際には非常に単純です。人々がそのための注釈が必要だと考える理由は本当にわかりません。)

しかし、私はそれを行うための何らかの方法があるに違いないと確信しています。 あなたはただ間違った人に尋ねているだけです。

これかもしれませんが、私は本当にわかりませんhttps://projectreactor.io/docs/core/3.4.0-M1/api/index.html?reactor/util/context/Context.html

クロージング:#782に取って代わられました。

@ yaakov-berkovitchと私が#779で配置しているものを使用すると、これを実装するのがさらに簡単になるはずです。

@gavinkingありがとう!!

このページは役に立ちましたか?
0 / 5 - 0 評価