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();
}
}
嗯,类似于那个。
感谢您的回答。
答案 0 :(得分:1)
不要试图过于聪明并假装客户端在服务器上,并且实体管理器始终处于打开状态。在客户端考虑域对象,就像您考虑DTO或JSON对象一样:包含来自服务器并通过线路分类的一些信息的对象。
记录从客户端调用的服务方法(facade方法),以指定初始化哪些关联以及哪些关联不在返回的实体中。如果您在某个“列表”屏幕上并希望查看列表中某个元素的详细视图,例如,调用另一个从数据库再次加载实体的服务(从而获得新的结果),可能还有其他初始化的关联,以显示有关该实体的更多详细信息。
尝试在客户端动态初始化延迟加载的关联只是不起作用:它复杂,效率低,导致客户端上过时且不连贯的图形,不考虑事务隔离。