避免在RESTful Web服务中加载整个对象图

时间:2013-08-26 19:19:00

标签: java spring java-ee spring-mvc jpa

我有一个使用JPA注释映射的域对象。 User有许多Question个对象(可能是1000个)。我必须在用户对象的问题列表中将获取类型设置为eager。我在Web服务中有这样的路径:

GET /users/3

这当然会返回用户对象以及他/她撰写的所有问题。 Question有自己的关系等等......

我的观点是,获得特定用户需要一点时间。最好只获得一些问题,然后根据需要加载更多问题。但是,我不认为我可以用那些注释做到这一点。那么我是否需要删除这些注释,而是手动查找特定用户的问题,然后为用户分配一个子集?

在Web服务中解决此类案例的常用方法是什么?如果提供的示例/伪代码将非常适用。我正在使用Spring MVC 3.2。

2 个答案:

答案 0 :(得分:3)

有多种方法可以解决这个问题。以下是我所知道的一些内容:

  1. 不要返回整个用户,只需返回他的“顶级数据”。有其他网址来获取其余数据。 EG:/users/1/questions来提问。
  2. 分页,正如svz在评论中所说的那样。一种方法是让用户传入limitoffset
  3. 1和2的组合。
  4. 有时休息apis有一个expand=true参数你可以传入。如果它是假的,它将返回“顶级数据”。如果这是真的,它将返回一个用户的所有问题。如果您明确要求,您只能获得所有数据。

答案 1 :(得分:0)

我认为答案是JPA和实体本身。我们还有一些用例需要返回一组非常大的数据,但在使用JPA + Hibernate时不需要返回相关数据。转换这些JPA实体真是太痛苦了。

所以,我们决定如何解决这些问题:

  1. 以必要的级别查询我们需要的数据
  2. 使用必要的数据分离对象
  3. 修剪/删除我们不需要的所有数据/关系以及对象及其属性
  4. 转换为JSON并返回
  5. 如果您需要维护关系,请考虑使用图表生成器,如下所示:http://code.google.com/p/google-gson/source/browse/trunk/extras/src/main/java/com/google/gson/graph/GraphAdapterBuilder.java?r=1170