3

1. 问题

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

2.用例

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

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

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

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

3. 可能的解决方案

我想出了一个解决方案,例如:我在客户端为我的 JPA 实体创建代理类。当我需要来自我的域模型的集合字段时,代理类将调用远程 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();
  }

}

嗯,类似的。

谢谢您的回答。

4

1 回答 1

1

不要试图太聪明,假装客户端在服务器上,实体管理器总是打开的。考虑客户端的域对象,就像考虑 DTO 或 JSON 对象一样:对象包含来自服务器的一些信息并通过网络进行序列化。

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

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

于 2012-06-02T06:36:47.347 回答