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

Java 如何初始化远程方法调用获取的Hibernate实体?,java,hibernate,remoting,rmi,Java,Hibernate,Remoting,Rmi,当使用Hibernate调用远程服务(例如通过RMI)从数据库加载实体列表时,如何管理它以初始化客户端需要的所有字段和引用 示例:客户端调用远程方法来加载所有客户。对于每个客户,客户都希望初始化对客户购买物品列表的引用 我可以想象以下解决方案: 为每个特殊查询编写一个远程方法,初始化所需字段 (例如Hibernate.initialize())并将域对象返回给客户端 像1。但是创建DTO 将查询拆分为多个查询,例如,一个用于客户,另一个用于客户文章,并让客户管理结果 远程方法采用Detached

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

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

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

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

  • 像1。但是创建DTO

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

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

  • 开发自定义的“预加载模式”,即客户端明确指定要预加载的属性的方式


  • 我过去使用过1,它工作得很好。

    我认为数字5就是HQL中有“fetch”子句的原因。您可以使用它吗?或者问题更复杂吗?

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

    然后还有访问web服务或类似服务的选项,其中两个通信的应用程序不共享任何类,这使得事情变得更加棘手。我将在不久的将来面对这个问题,我很想知道答案。

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


    Yuval=8-

    我在一家客户那里,他将其“5号项目”标准化,效果非常好。 服务调用的最后一个参数是要加载的所有属性的逗号分隔列表,例如:

    CustomerService.getCustomerById(id, "parent, address, address.city")
    
    我相信他们使用了fetch子句。
    我曾经为jpa实现过同样的想法,使用PropertyUtils来触发延迟加载。

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


    但就个人而言,我认为DTO是正确的选择。通过用DTO表示远程接口,您可以确保您得到了所需的一切,而没有任何出乎意料的东西。

    这种急切获取方式仅限于某些类型的查询