0

これは初心者のエラーだと確信しています...

そのため、エンティティ、ファサード(永続層を実装)、およびリモートインターフェイス(ファサードを介してエンティティへのアクセスを提供)を備えたステートレスセッションBean(EJB3)を備えたJavaEE6アプリケーションがあります。

これは正常に機能しています。SLSBを介して、エンティティを取得および操作できます。

今、私はこれをWebアプリケーションから実行しようとしています(同じGlassfishにデプロイされ、Java EEアプリからのエンティティ+インターフェイス定義が別のjarとしてインポートされます)。挿入されたSLSBのインスタンスを受け取るサーブレットがあります。エンティティを取得するために取得すると、次のようになります(ログで確認できます)。

  • リモートSLSBがインスタンス化され、そのメソッドが呼び出されます
  • SLSBはファサードをインスタンス化し、「get」メソッドを呼び出します
  • ファサードはDBからエンティティのインスタンスを取得し、それを返します
  • SLSBは、エンティティのインスタンスを呼び出し元に返します
    • (ここまではすべて良いです)
  • サーブレットを呼び出すと、エンティティの空のインスタンスが受信されます。

何が問題になっていますか?これはうまくいくはずですよね?

MyServlet:

public class MyServlet extends HttpServlet {

  @EJB
  private CampaignControllerRemote campaignController; // remote SLSB

  protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    response.setContentType("text/plain");
    PrintWriter out = response.getWriter();
    try {
      Campaign c = campaignController.getCampaign(5L); // id of an existing campaign
      out.println("Got "+ c.getSomeString()); // is null !!
    } finally { 
        out.close();
    }
  }
  ...
}

他のコードを見たい場合はお知らせください。投稿を更新します。

4

1 に答える 1

0

...ああ、これはちょっと恥ずかしいです...

結局のところ、私は、 :との関係をVector保持するフィールドのタイプとしての使用に関するちょっとした警告を無視してきました。@xxToManyFetchType.LAZY

JPA仕様がjava.util.Collection、java.util.Set、java.util.List、またはjavaのみをサポートする場合、エンティティクラス[classCampaign]内の要素[fieldsomeField]はコレクションタイプ[classjava.util.Vector]を使用します.util.Map。このタイプは、積極的な読み込みでサポートされています。このコレクションタイプで遅延読み込みを使用するには、追加の構成と、[class java.util.Vector]を拡張するIndirectContainer実装、または基本的な間接参照とタイプをValueholderInterfaceに使用するようにマッピングを設定する必要があります。

2つの可能な解決策が私の行動を修正することができます:

  • 使用するFetchType.EAGER(その後、私はとどまることができますVector
  • 使用するList(仕様にあるように...)
于 2010-04-21T17:24:21.907 に答える