如何初始化通过远程方法调用获取的Hibernate实体?

时间:2020-03-06 14:35:09  来源:igfitidea点击:

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

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

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

  • 为每个特殊查询编写一个远程方法,该方法初始化必填字段(例如Hibernate.initialize())并将域对象返回给客户端。
  • 与1.类似,但创建DTO
  • 将查询分为多个查询,例如一个给客户,第二个给客户的文章,然后让客户管理结果
  • 远程方法采用DetachedCriteria,由客户端创建并由服务器执行
  • 开发自定义的"预加载模式",即客户端明确指定要预加载哪些属性的方法。

解决方案

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

我认为数字5是为什么HQL中有一个" fetch"子句的原因。我们可以使用它还是问题更复杂?

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

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

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

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

但是,就我个人而言,我认为DTO是正确的方法。通过用DTO表示远程接口,可以确保我们获得所需的一切,而没有我们没有想到的。