2 つのアプリケーションがあります。1 つはアプリケーション クライアント、もう 1 つは EJB プロジェクトです。私のクライアントはサーバー側への参照を持っています.Container Managed BeanトランザクションはBeanで使用されています.次のステートメントを使用してエンティティマネージャーをBeanに注入できません.
@PersistenceContext(unitName = "DBService")
private EntityManager em;
サーバー側にメッセージ駆動型 Bean、2 つのステートレス Bean、およびシングルトン Beanがあります。メッセージ駆動型 Bean から 2 つのステートレス Bean をローカルに注入しました。JMS メッセージのメッセージ タイプ (サーバーまたはクライアントから送信されたもの) に応じて、メッセージ駆動型 Bean は関連するステートフル Bean のビジネス メソッドを呼び出します。また、ステートレス Bean のそれぞれがシングルトン Bean を注入します。 .
シングルトン Bean のエンティティにいくつかの変更を加え、エンティティのいくつかのフィールドを更新し、jms メッセージをクライアントまたはサーバーに送信しています。メッセージが 2 つのステートレス Bean によって処理される場合、singleton Bean のビジネス メソッドが呼び出されます。たとえば、エンティティのフィールドを変更しました。次に、シングルトン Bean が jms メッセージをクライアントに送信し、クライアントが何らかの作業を行い、メッセージをサーバーに送り返し、サーバーがこのメッセージをメッセージ駆動型 Bean で消費し、関連するステートレス Bean のビジネス メソッドを呼び出します。 、その後、ステートレス平均はシングルトン Bean のビジネス メソッドを呼び出します。次に、データベースからクエリを実行していますが、変更されたエンティティの最新の状態を確認できません。私の変更は上書きされます。Singleton Bean の EntityManager は、複数の Bean から注入されると、エンティティの状態を正しく保持できないと思いました。同じシングルトン Bean インスタンスを接続プールから取得する必要があると考えました。私はこれについて深刻な問題を抱えています。
私の検出は正しいと思いますか? または私は何か間違ったことをしていますか?
問題: ステートレス Bean がシングルトン Bean のメソッドを呼び出すと、新しいトランザクションが開始され、次に 2 番目のステートレス Bean がシングルトン Bean のメソッドを呼び出し、それもトランザクションを開始しますが、前のトランザクションはコミットされず、2 つのトランザクションは変更を認識していないと思いますお互いが作ったもの。しかし、これを解決する方法がわかりません。Bean 管理のトランザクションを使用することは、シングルトン Bean の優れたソリューションですか?