Spring REST设计用于使用Hibernate对子引用进行PUT更新



所以我在Spring网站上查看了@PutMapping示例https://spring.io/guides/tutorials/rest/

我注意到,他们调用数据库以获得具有该idEmployee实体,然后使用请求中的名称和角色更新存储库中的实体。

@PutMapping("/employees/{id}")
Employee replaceEmployee(@RequestBody Employee newEmployee, @PathVariable Long id) {
return repository.findById(id)
.map(employee -> {
employee.setName(newEmployee.getName());
employee.setRole(newEmployee.getRole());
return repository.save(employee);
})
.orElseGet(() -> {
newEmployee.setId(id);
return repository.save(newEmployee);
});
}

这对于一个小的示例演示来说很好,但如何在更复杂的实体上处理它?

如果Employee有一个Laptops列表

假设JSON中的列表看起来像

{
"name": "John",
"role": "MyRole",
"laptops": [
{
"model": "abc",
"serial": "123"
},
{
"model": "xyz",
"serial": "789"
},
]
}

当然,如果存储库中的映射是正确的,那么您将返回一个Employee实体,其中包含笔记本电脑列表和Java端的笔记本电脑id。

但如果用户对笔记本电脑的请求看起来像:

{
"id": 1,
"name": "John",
"role": "MyRole",
"laptops": [
{
"model": "abcModified",
"serial": "123"
},
{
"model": "newModel-xyz was actually removed from the list",
"serial": "456"
},
]
}
  1. 在这种情况下你会怎么做?我们应该把外国钥匙寄回去吗
  2. 如果我们发送外键,如何阻止某人引用不属于实体的外键
  3. 如何属性映射一个复杂的对象,该对象可能包含具有其他已修改列表的对象列表

Edit:我调用Employee路径,因为我需要更新rolelaptops的列表

首先,当您想用没有子实体id的父对象更新子对象时,必须删除以前的子对象并重新创建。

您可以在get API中发送子id,以便在更新时发送它们。然后对于put请求,您可以通过id找到这些子项,并更新它们,如果可用,还可以添加新的子项。

但最好的方法是也为子实体编写单独的API。使用外键更新id和引用的现有子项,并使用单独的API创建新项。

最新更新