如何初始化通过远程方法调用获取的 Hibernate 实体?
Posted
技术标签:
【中文标题】如何初始化通过远程方法调用获取的 Hibernate 实体?【英文标题】:How to initialize Hibernate entities fetched by a remote method call? 【发布时间】:2010-09-12 07:04:01 【问题描述】:当调用远程服务(例如通过 RMI)以使用 Hibernate 从数据库加载实体列表时,您如何管理它以初始化客户端需要的所有字段和引用?
示例:客户端调用远程方法加载所有客户。对于每个客户,客户都希望对客户购买商品列表的引用进行初始化。
我可以想象以下解决方案:
为每个特殊查询编写一个远程方法,初始化所需字段 (例如 Hibernate.initialize())并将域对象返回给客户端。
类似 1. 但创建 DTO
将查询拆分为多个查询,例如一个给客户,第二个给客户的文章,让客户管理结果
远程方法采用DetachedCriteria,由客户端创建并由服务器执行
开发自定义“预加载模式”,即客户端明确指定要预加载哪些属性的方法。
【问题讨论】:
【参考方案1】:我以前用过 1,效果很好。
【讨论】:
【参考方案2】:我认为数字 5 是 HQL 中存在“获取”子句的原因。您可以使用它还是问题更复杂?
【讨论】:
这种急切获取仅限于某些类型的查询【参考方案3】:我遇到过一个客户,该客户在 #5 上对其项目进行了标准化,并且效果非常好。 服务调用的最后一个参数是要加载的所有属性的逗号分隔列表,例如:
CustomerService.getCustomerById(id, "parent, address, address.city")
我相信他们为此使用了 fetch 子句。 我曾经使用 PropertyUtils 为 jpa 实现了相同的想法来触发延迟加载。
【讨论】:
【参考方案4】:这个远程服务...它是同一个应用程序的另一部分吗?如果是这样,那么共享类和来回发送实例就没有问题(RMI 也是如此,使用存根)。
然后可以选择访问 Web 服务或类似的东西,其中两个通信的应用程序不共享任何类,这使事情变得更加棘手。我将在不久的将来面对这个问题,我很想知道答案。
无论如何,我的投票是支持 DTO。我认为它们在适用的情况下提供了最好和最简单的解决方案,并有助于保持代码简单和可维护。
尤瓦尔=8-)
【讨论】:
【参考方案5】:如果您的远程服务仅用于为您的客户端提供数据,那么关闭所有 Hibernate 实体上的延迟加载可能会有所帮助。
不过,我个人认为 DTO 是正确的方法。通过以 DTO 的形式表达您的远程接口,您可以确保获得所需的一切,而不是您没有预料到的。
【讨论】:
以上是关于如何初始化通过远程方法调用获取的 Hibernate 实体?的主要内容,如果未能解决你的问题,请参考以下文章