JPA 2.0、JSF 2.0、EJB 3.1 などを含む JEE6 スタックを使用しています。
私のアーキテクチャのセットアップ方法は次のとおりです。
JPAプロバイダーとしてhibernateを使用して、JPAアノテーション付きDAOを持っています。facelet/xhtml ページに対応する JSF Managed Bean があります。すべてのデータベース要求を処理する EJB があります。
私の XHTML ページには、マネージド Bean を呼び出す JSF EL があります。マネージド Bean には、EJB によって管理される DAO エンティティへの参照が含まれています。たとえば、db テーブルにマップされたユーザー エンティティがあります。ユーザーを返すすべての CRUD 操作を処理するユーザー EJB があります。ユーザーを編集するページがあります。高レベルのワークフローは次のようになります: ユーザー編集ページに移動 -> EL は、ユーザーをロードするマネージド Bean にあるメソッドを呼び出します。このメソッドは、EJB から userEJB.loadUser(user) を呼び出して、データベースからユーザーを取得します。ユーザーが編集されて送信されます -> マネージド Bean で関数が呼び出され、EJB で関数が呼び出されてユーザーが保存されます。等
EJB を使用して JSF ページ内のデータにアクセスする際に問題が発生しています。遅延初期化エラーで多くの問題が発生しています。これは、セットアップ方法が原因であると考えています。
たとえば、遅延ロードされるユーザーのリストを持つ Client エンティティがあります。クライアントを取得するために、EJB でメソッドを呼び出します。このメソッドはデータベースにアクセスし、クライアントを見つけて返します。後で、このクライアントのユーザー リストにアクセスしたいのですが、そのためには、何らかのメソッドを呼び出して EJB に戻り、それらのユーザーをロードする必要があります (ユーザーは遅延ロードされるため)。これは、次のようなメソッドを作成する必要があることを意味します
public List<User> getUserListByClient(Client c)
{
c = em.merge(c); return c.getUserList();
}
このメソッドの唯一の目的は、ユーザーをロードすることです (そして、このアプローチが優れているか、機能するかについては確信が持てません)。私が自分でセッション管理を行っていた場合、リクエスト全体に対してセッションを開いたままにして、プロパティに直接アクセスしたいのですが、とにかくセッションが開いているので問題ありません.EJBには間接的なレイヤーが1つあるようです.それは私にとって物事を困難にしています。
コンテナーによって制御され、プールされ、無料でトランザクション管理を提供するなどの点で、EJB が好きです。しかし、EJB を正しく使用していないか、JSF アプリを正しく設定していないような気がします。
どんなフィードバックでも大歓迎です。
ありがとう、