对SpringDataREST2.1中的子资源进行分页
我使用带有默认配置的SpringDataREST2.1.1版本。考虑到下列资源:对SpringDataREST2.1中的子资源进行分页,spring,pagination,spring-data-rest,Spring,Pagination,Spring Data Rest,我使用带有默认配置的SpringDataREST2.1.1版本。考虑到下列资源: GET /communities/MyCommunity { "creationDate": "2014-07-16T06:22:37.153+0000", "name": "GroupeSEB", "_links": { "self": { "href": "http://localhost:8080/api/communities/GroupeS
GET /communities/MyCommunity
{
"creationDate": "2014-07-16T06:22:37.153+0000",
"name": "GroupeSEB",
"_links": {
"self": {
"href": "http://localhost:8080/api/communities/GroupeSEB"
},
"posts": {
"href": "http://localhost:8080/api/communities/GroupeSEB/posts"
}
}
}
当我获得“posts”子资源时:
GET /communities/MyCommunity/posts
{
"_embedded": {
"posts": [
{
"creationDate": "2014-07-09T13:09:14.535+0000",
"id": "53bd3efae4b012818368c549",
"_links": {
"self": {
"href": "http://localhost:8080/api/posts/53bd3efae4b012818368c549"
}
}
}
]
}
}
未启用分页。由于我的父资源可以聚合大量帖子(它的子资源),如何才能为每个子资源启用分页?答案很简单:你不能。理由如下: 关联资源表示主实体与一个或多个其他实体之间的关联。因此,要呈现这些资源,我们需要查找主实体并只访问属性。这意味着,不会使用存储库,也不会应用位置分页,因为整个机制与存储无关。我们在实体实例上操作,如何加载关联的机制是高度特定于存储的 因此,如果您的域模型中已经存在对象关联,那么您将完全遵循存储处理关联的方式。因此,即使应用了分页,也必须首先读取所有相关对象才能获得它们的ID
作为一种解决方法,您可以仅使用ids并手动公开该路径上的资源权限,该路径将使用ids和相关实体存储库上的专用查询方法。Oliver给出的答案并不完全正确 在嵌套实体(集合)上,没有存储库使用。但在惰性嵌套实体(集合)上,存在存储库使用情况@默认情况下,One2Many是懒惰的。因此,在检索父实体时,不会填充嵌套实体,也不会从repo检索嵌套实体。只有在会话中访问嵌套实体时,才会填充该实体。 在Spring数据中,父实体的REST列表从不访问嵌套实体。当通过嵌套实体访问URL ie访问嵌套的惰性实体时。 /社区/群体EB/职位 是否访问嵌套对象,因为该嵌套对象不是对象实例,而是将导致从repo检索的对象的懒散代理。 好的,嵌套对象可以从Repo的Repo层缓存insead中检索,但是我认为可以禁止嵌套实体/对象上的缓存 因此,如果有一种方法可以在LazyProxy实现上传递/检索分页信息,那么这可能会起作用
另外,我在@One2Many和@ManyOne之间进行双向导航时从经验中了解到了它们,为了防止N+1出现在列表中,我设置了@ManyTone(fetch=FetchType.LAZY),然后用@NamedEntityGraph覆盖repo接口中的相关findbyId(),当用@NamedEntityGraph检索时,嵌套项会被强制为渴望。这并不直接适用于这个问题,但确实证明了在spring数据rest中,对NSETD实体的检索是可控的 面对同样的问题,在我的例子中,由于大的结果集,子资源导致了GC错误,这就更加严重了。我认为我还应该重新暴露于虚假的资源,并在存储库中手动提供一个可分页的资源,通过ResourceProcessor.Related链接绑定-