使用EclipseLink的远程客户端的JPA延迟加载策略

时间:2012-06-02 01:13:14

标签: jpa ejb-3.0 lazy-loading eclipselink

1。问题

客户端有哪些已知策略,LAZY加载解决方案? 我正在检查这些东西http://wiki.eclipse.org/Introduction_to_EclipseLink_Sessions_(ELUG)#Remote_Sessions但不确定这是否是我的问题的解决方案或如何使用它。

2。用例

我正在开发一个三层应用程序,其中我的表示层(Eclipse RCP)是网络上的远程客户端:

[ Eclipse RCP ] <-----(RMI)-----> [ [EJB 3] [JPA 2] [Mysql] ]

现在,我使用 JPA Entities 作为我的域模型,我也希望在我的客户端中使用它。我通过网络从 @Session bean获取了这些信息。 当我的JPA Entites有 LAZY 字段时会出现问题。在序列化之后,特别是因为我的JPA提供程序(EclipseLink)位于网络的另一端,我需要一个策略来从客户端加载那些LAZY字段。

我将有很多实体:30-40也许。典型情况是当用户看到SomethingModel的列表时,其中包含许多List个字段,但只有在她想要更改特定元素时才需要在列表中显示这些字段。

第3。可能的解决方案

我提出了一个解决方案,例如:我在客户端为我的JPA entites创建代理类。当我需要来自我的Domain模型的集合字段时,代理类将调用远程EJB来填充该字段。

class CarModelClient {
  CarModel model;

  public String getColor(){
    model.getColor();
  }

  public List<Wheels> getWheels(){
    CarModelFacadeRemote carFacade = //get my remote ejb
    model.setWheels( carFacade.getWheels( model.getId() ) );
    return model.getWheels();
  }

}

嗯,类似于那个。

感谢您的回答。

1 个答案:

答案 0 :(得分:1)

不要试图过于聪明并假装客户端在服务器上,并且实体管理器始终处于打开状态。在客户端考虑域对象,就像您考虑DTO或JSON对象一样:包含来自服务器并通过线路分类的一些信息的对象。

记录从客户端调用的服务方法(facade方法),以指定初始化哪些关联以及哪些关联不在返回的实体中。如果您在某个“列表”屏幕上并希望查看列表中某个元素的详细视图,例如,调用另一个从数据库再次加载实体的服务(从而获得新的结果),可能还有其他初始化的关联,以显示有关该实体的更多详细信息。

尝试在客户端动态初始化延迟加载的关联只是不起作用:它复杂,效率低,导致客户端上过时且不连贯的图形,不考虑事务隔离。