0

我确定这是一个初学者错误...

所以我有一个带有实体、外观(实现持久层)和无状态会话 Bean(EJB3)的 Java EE 6 应用程序,以及远程接口(通过外观提供对实体的访问)。

这工作正常。通过 SLSB,我可以检索和操作实体。

现在,我正在尝试从 Web 应用程序(部署在同一个 Glassfish 上,从作为单独 jar 导入的 Java EE 应用程序的实体+接口定义)中执行此操作。我有一个 Servlet,它接收注入的 SLSB 实例。我让它检索一个实体,然后发生以下情况(我可以在日志中看到它):

  • 远程 SLSB 被实例化,其方法称为
  • SLSB 实例化外观,调用 'get' 方法
  • 外观从数据库中检索实体实例,返回它
  • SLSB 将实体的实例返回给调用者
    • (直到这里一切都很好)
  • 调用 servlet 接收到 .. 实体的空实例!!

出了什么问题?这应该有效,对吧?

我的Servlet:

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

……哦,男孩,这有点尴尬……

事实证明,我一直忽略一个关于使用Vectoras 类型的一个很好的小警告,该字段与以下内容有@xxToMany关系FetchType.LAZY

当 JPA 规范仅支持 java.util.Collection、java.util.Set、java.util.List 或 java 时,实体类 [class Campaign] 中的元素 [field someField] 使用集合类型 [class java.util.Vector] .util.Map。急切加载支持此类型;使用此集合类型的延迟加载需要额外的配置和扩展 [class java.util.Vector] 的 IndirectContainer 实现,或者将映射设置为使用基本间接,并将类型设置为 ValueholderInterface。

两种可能的解决方案可以解决我的行为:

  • 使用FetchType.EAGER(然后我可以留下来Vector
  • 使用List(如规范所说......)
于 2010-04-21T17:24:21.907 回答