将Spring数据';s save()方法是否在实体没有更改的情况下更新数据库中的实体?
编辑表单时,用户有时可能不会更改表单,但仍会单击“提交”按钮。在下面的一个控制器方法中,save()方法是否会执行对数据库的查询并更新字段,即使用户没有更改任何内容将Spring数据';s save()方法是否在实体没有更改的情况下更新数据库中的实体?,spring,hibernate,spring-data-jpa,spring-data,hibernate-mapping,Spring,Hibernate,Spring Data Jpa,Spring Data,Hibernate Mapping,编辑表单时,用户有时可能不会更改表单,但仍会单击“提交”按钮。在下面的一个控制器方法中,save()方法是否会执行对数据库的查询并更新字段,即使用户没有更改任何内容 PostMapping("/edit_entry/{entryId}") public String update_entry( @PathVariable("entryId") Long entryId, @RequestParam String title,
PostMapping("/edit_entry/{entryId}")
public String update_entry(
@PathVariable("entryId") Long entryId,
@RequestParam String title,
@RequestParam String text
) {
Entry entry = this.entryRepo.findById(entryId).get();
if (!entry.getTitle().equals(title))
entry.setTitle(title);
if (!entry.getText().equals(text))
entry.setText(text);
this.entryRepo.save(entry);
return "redirect:/entries";
}
此外,在这种情况下是否需要“if”语句?调用
save(…)
时到底发生了什么取决于下面的持久化技术。基本上有两类实现:
在您的具体示例中,MongoDB实现仍然会发出更新,而如果请求参数不包含不同的值,JPA根本不会发出更新。entryRepo是否扩展了JpaRepository或Crudepository?
entryRepo
扩展了Crudepository。如果没有任何更改,则不进行更新,jpa将阻止它,并且不会发出语句(除非您有一些动态计算的字段,如上次更新的时间戳)。此外,您使用的可选方式也不正确。不要使用get
(如果找不到它将失败),而是使用map
。@M.Deinum谢谢!我肯定会考虑使用<代码> map <代码>而不是“获取”!因此,在我看来,谈论第一类实现时,“if”语句不会使过程更快,因为行this.entryRepo.save(entry)代码>仍将执行…但如果我添加一个布尔变量,如boolean changed=false代码>位于一系列“if”语句的正上方,以便在字段被更改的“if”块中将变量转换为true
,然后我包装this.entryRepo.save(条目)
如果changed
变量保持true
值(即注意到一些更改),将执行的“if”块中,检测更改是否会更快,或者这些“if”语句的存在是否毫无用处?