私は情報システムを開発していますが、対処方法がわからないことがあります。私のウェブサイトで管理者がユーザーを編集できるとしましょう。2人の管理者が同じユーザーを同時に編集したい場合、後で編集をクリックした後、最初の管理者は許可されるべきではありません。
そのため、管理者が編集ボタンをクリックしたときにトランザクションを開き、編集したフォームを送信したときにコミットしたいと思います。
私が考えることができる1つの解決策は、EntityManagerをNamedConversationScopedCDIBeanに配置することです。ただし、プレゼンテーション層はビジネス層から分離する必要があり、データベースアクセスはビジネス層に属するため、これは適切なソリューションではないと思います。
別の解決策は、EntityManagerをステートフルBeanに配置し、ステートフルBeanのメソッドを呼び出すNamed ConversationScopedCDIBeanからのトランザクションを管理することです。しかし、Web層でトランザクションを管理することは良い考えですか?ビジネス層を別のアプリケーションサーバーにデプロイすることにした場合、リモートEJBでのトランザクションの管理は機能しますか?また、EJBが不動態化された場合、トランザクションは失われますか?
これは別の問題にも関連しています。EntityManagerを使用してデータベースからオブジェクトを取得すると、トランザクションが閉じられるとすぐにオブジェクトが切り離されます。オブジェクトに遅延初期化フィールドがある場合、オブジェクトがWeb層に戻されるとデタッチされるため、Web層はそれらにアクセスできません。したがって、Web層でトランザクションを管理するか、ビジネス層で遅延初期化されたフィールドを反復処理することができます。前者の解決策は正しくないようであり、後者は非常に冗長で複雑になる可能性があります。
質問が多すぎることは知っていますが、これを適切に行う方法を本当に知りたいです。
CDI、Seam 3、EJBのテクノロジーを利用できます。
もちろん、あなたがより良い解決策を知っているなら、私はそれを聞いてうれしいです。
前もって感謝します。