当使用Hibernate调用远程服务(例如通过RMI)从数据库加载实体列表时,如何管理它以初始化客户端需要的所有字段和引用?

示例:客户端调用远程方法来加载所有客户。对于每个客户,客户希望初始化客户的购买物品清单。

我可以想象以下解决方案:

  1. 为每个特殊查询编写一个远程方法,初始化所需的字段 (例如,Hibernate.initialize())并将域对象返回给客户端。

  2. 喜欢1.但创建DTO

  3. 将查询拆分为多个查询,例如一个用于客户,另一个用于客户的文章,并让客户管理结果

  4. 远程方法采用DetachedCriteria,由客户端创建并由服务器执行

  5. 开发自定义“预加载模式”,即客户端明确指定要预加载哪些属性的方法。

有帮助吗?

解决方案

我过去使用过1,效果很好。

其他提示

我认为数字5是为什么有一个“获取”的原因。 HQL中的子句。你能用它还是问题更复杂?

我一直在客户身上标准化了#5项目并且效果非常好。 服务调用的最后一个参数是要加载的所有属性的逗号分隔列表,例如:

CustomerService.getCustomerById(id, "parent, address, address.city")

我相信他们为此使用了fetch子句。 我使用PropertyUtils触发延迟加载,为jpa实现了一次相同的想法。

这个远程服务......是同一个应用程序的另一部分吗?如果是这样,共享类和来回发送实例没有问题(对于RMI,使用存根也是如此)。

然后可以选择访问Web服务或类似的东西,其中两个通信的应用程序不共享任何类,这使得事情变得更加棘手。我将在不久的将来面对这个问题,我将非常有兴趣知道答案。

无论如何,我的投票是针对DTO。我认为它们在适用的情况下提供了最佳和最简单的解决方案,并有助于保持代码的简单性和可维护性。

Yuval = 8 - )

如果您的远程服务仅存在为您的客户端提供数据,那么关闭所有Hibernate实体上的延迟加载可能会有所帮助。

然而,就个人而言,我认为DTO是正确的方法。通过在DTO方面表达您的远程界面,您确信您可以获得所需的一切,而不是您没有想到的任何东西。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top