我想知道使用 PUT 方法更新存储在数据库中的实体的特定属性时的最佳实践是什么。
让我们看看 Rest Controller 上接收到的以下 json:
{"id":1, "surname":"Doe"}
我们存储的实体看起来像这样:
public class Employee {
Long id;
String name;
String surname;
Date createdAt;
Date updatedAt;
}
为了简单起见,我省略了注释。
我想要实现的是,在 RestController 上我收到如下内容:
@PutRequest
public Employee updateEmployee(@RequestBody Employee employee) {
repo.saveAndFlush(employee);
}
因此,如果我这样做,则 name
和时间戳的现有字段将设置为 null,因为提供的实体不包含此类字段。
我想知道是否有办法运行以下操作:
- 使用数据库上提供的 ID 加载实体
- 更新 Json/请求正文中提供的字段。
- 保留更新后的实体 -> 这可以按照我在代码中所示的相同方式完成。
我知道它存在 @JsonIdentity 和 @JsonIdentifyreference(alwaysAsId=true),我将它们与解析器结合使用从数据库中获取数据,以获取仅提供 ID 而不是实体本身的嵌套实体。
最佳答案
PATCH
方法是为该功能而设计的。
PUT
- 这意味着在请求中未提供的字段上设置 null
。
PATCH
用于更新资源,您可以更新单个字段,也可以更新所有字段,您可以选择。
请注意,实际的数据库更新可能不会自动工作,只是因为您更改了 HTTP 方法。对于 Hibernate,有一个 @DynamicUpdate
提供相同的功能。如果没有 @DynamicUpdate
,设置为 null
的字段将被更新,但如果使用 @DynamicUpdate
,则仅更新已修改的字段。
关于java - Spring/JPA/Jackson 中的差异 HTTP PUT 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54145407/