0

私がやること

asyncシステムで新しいエンティティが作成されるたびに反応するシステムがありmain、このasyncシステムはデータベースに新しく作成されたエンティティを照会します。


どのように私はそれを行う

asyncシステム iのメッセージを作成するには、hibernate interceptor.

したがって、新しいエンティティが作成されるたびonSaveに、インターセプターのメソッドが呼び出され、i

エンティティ ID を に保存しlistますafterTransactionComplete(Transaction tx)

と呼ばれ、メッセージング システム (ActiveMq) を使用してシステムentity id内のすべてをフラッシュします。listasync


何が問題ですか

現在、problem処理中のトランザクションが複数ある場合に発生します..両方

トランザクションはエンティティを作成します。

例を挙げましょう:

Tx_Aエンティティを作成しますEA1, EA2

Tx_Bエンティティを作成しますEB1, EB2

ここで、実行フローが次のように発生するとします。

[1] EA1 の onSave、EA1 id を flushList に追加します

[2] EB1 の onSave、EB1 id を flushList に追加します

[3] Tx_A の afterTransactionComplete(tx)

この時点で、データベースにクエリを実行するときにEA1 and EB1IDをシステムにフラッシュしますasync

トランザクションがまだ完了していない ため、EB1null が見つかりました。Tx_B


onsave呼び出しでトランザクションIDを取得でき、afterTransactionCompletionそのトランザクションに関連するエンティティのみをフラッシュできる場合、この問題は解決できます

[1] このトランザクション ID を取得する方法はありますか?

[2] 上記の問題に対する他の解決策はありますか?

私は休止状態4.2.2を使用しています

4

1 に答える 1

0

この問題は、グローバル スコープ インターセプターを使用している場合にのみ発生します。

セッション スコープ インターセプターを使用する場合、新しいトランザクションごとに新しいインターセプターがあるため、問題はありません。

于 2014-04-01T08:27:29.320 に答える