6

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

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

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

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

  2. 像 1. 但创建 DTO

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

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

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

4

5 回答 5

1

我过去使用过 1 并且效果很好。

于 2008-09-23T08:07:11.873 回答
1

我认为数字 5 是 HQL 中存在“获取”子句的原因。您可以使用它还是问题更复杂?

于 2008-09-23T08:28:54.147 回答
1

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

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

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

于 2008-09-23T09:03:30.613 回答
0

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

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

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

尤瓦尔=8-)

于 2008-09-23T08:34:08.797 回答
0

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

然而,就我个人而言,我认为 DTO 是正确的方法。通过用 DTO 来表达您的远程接口,您可以确定您得到了您需要的一切,并且没有您没有预料到的。

于 2008-09-23T09:27:34.533 回答