5

ここで基本的な理解の問題を抱えていると思います。誰かがこれを説明してくれることを願っています。

ステートフルな EJB_A とステートフルな EJB_B とセッション スコープの ManagedbeanA があるとします。

@Stateful
@LocalBean
public class EJB_A {
}

@Stateful
@LocalBean
public class EJB_B {
  @EJB
  EJB_A ejb;
}
@ManagedBean
@SessionScoped
public class ManagedBeanA {
   @EJB
   EJB_A ejb;
}

ManagedBeanA では、EJB_A が作成されます。EJB_A をプロパティとして持つ EJB_B を使用すると、EJB_A の新しいインスタンスが EJB_B 内に作成されます。以前に ManagedBeanA で作成された EJB_A の同じインスタンスではありません。

ステートフル EJB の全体的なポイントは、クライアントごとに 1 つのインスタンスのみが作成され、EJB コンテナーによって共有および管理されるということだと思っていたので、それがわかりません。誰かが私にこれを説明してもらえますか? また、EJB の同じインスタンスを他の複数の EJB で共有する方法を教えてください。

ありがとうございました

4

3 に答える 3

9

はい、あなたはさまざまな概念とさまざまな API を混同しました... @EJB よりも @Inject を使用して、注入されたインスタンスのスコープを指定したいと思います..

@Stateful
@LocalBean
public class EJB_A {
}

@Stateful
@LocalBean
public class EJB_B {
  @Inject @SessionScoped
  EJB_A ejb;
}
@ManagedBean
@SessionScoped
public class ManagedBeanA {
   @Inject @SessionScoped
   EJB_A ejb;
}
于 2012-11-30T09:34:42.373 に答える
2

私はここでいくつかの読書をしました。

その理由は、EJB 3.0 ステートフル セッション Bean のリモートまたはローカル ビジネス インターフェースの各 lookup() によって、新しい Bean ID が作成されるためです。ルックアップから返される各参照は、異なるステートフル セッション Bean を参照します。その参照へのアクセスをどのように管理するかは、呼び出し元が決定します。通常、Web アプリケーションは、以降のアクセスのために、参照を HttpSession またはアプリケーション全体 (ServletContext) のスコープに格納します。

と:

あなたのケースでは、Bean セッションと Web セッションの 2 種類のセッションを扱っていることを忘れないでください。前者は、ステートフル Bean を要求すると、その ID がそのユーザー セッション全体で同じままであることを保証します。ただし、後者を使用すると、Bean セッションの上に Web セッションがあります。2 つの異なる JSP から同じ Bean に確実にアクセスするには (またはリロード時に)、Bean の ID を Web セッション スコープに格納する必要があります。

だからあなたは実際に正しいです。EJB インスタンスはこのセッション コンテキストに関連付けられているため、インスタンスを使用する場合は、ManagedBean を使用して別の場所で取得する必要があります。したがって、単純化し、EJB がセッションごとに 1 回だけ存在することを確認したい場合は、CDI を使用して、EJB 自体に追加で@javax.enterprise.context.SessionScoped;というアノテーションを付けます。あなたが確信できるよりも。

于 2012-11-30T09:26:54.743 に答える
1

@Sessionscopedと@Statefulの2つを混同したと思います。

@Statefulアノテーションは、クライアントごとに1つのインスタンスのみが作成されることを意味するものではありません。これは、@ Stateful-EJBが1つのクライアントにのみ属しているのに対し、@Stateless-EJBは複数のクライアントで共有できることを意味します。

したがって、@ Stateful-EJBにはN:1の関係があり(Nの@ Stateful-EJBは正確に1つのクライアントに属します)、@ Stateless-EJBにはN:Mの関係があります(Nの@ Stateless-EJBSはMのクライアントに属します)。つまり、@ StatefulEJBの@EJBアノテーションを使用するだけでは、EJBインスタンスを他の複数のEJBで共有することはできません。

一方、@ Sessionscoped-Managedbeanは、クライアントごとに1回だけ作成されるようです。

私はそれを正しく理解しましたか?

于 2012-11-30T08:44:05.217 に答える