假设我有以下结构:
@Entity
class Person extends AbstractPersistable<Long> {
String name
String surname
}
@Entity
class Task extends AbstractPersistable<Long> {
String description
@ManyToOne
Person person
}
如果我遵循正确的HAL
指南,我不应该公开实体ID。由于我没有双向关系,因此我无法PUT
或PATCH
到http://localhost:8080/persons
。
即使我确实创建了关系,我可能也不想先POST
Task
到/tasks
然后PUT
到{{1} },(移动客户端会杀了我)。但即便如此,我甚至不会从返回的实体中获得/persons
,因此我可以Task ID
到PUT
实体。 (我显然可以解析,但我认为这不合适。)
我可能不希望在Person
实体中列出1000个任务。因此,不导出Person
实体不是一个真正的选择(这意味着Task
将无效)
那么,如果我无法获得他的身份,我应该如何将PATCH
与Person
联系起来?什么是正确的方法?
答案 0 :(得分:3)
如果要将任务与人员关联,则需要指向该人员的链接。
假设此人URI为http://localhost/persons/1
然后,您可以通过在person属性中传递该URI来将人员分配给任务。
所以Task的帖子看起来像这样:
{{1}}
Spring-data-rest将查找该人并负责其余部分。
答案 1 :(得分:1)
在HAL中,链接用于引用相关资源而不是ID,而HAL实体应始终返回自身的链接,该链接用作其唯一标识符。
如果我没弄错,你也可以使用DBRef注释字段,并为你生成链接。
如果您希望相关资源实际显示为内嵌数据,则您必须草拟投影。点击此处了解更多信息:
Spring Boot REST Resource not showing linked objects (sets)
最后但并非最不重要 - 如果您希望Projections也包含链接,您必须为它们制作ResourceProcessor,请参阅此处: