如果实体没有变化,Spring Data 的 save() 方法是否会更新数据库中的实体?
Will Spring Data's save() method update an entity in the database if there are no changes in the entity?
在编辑表单时,用户有时可能不更改表单而仍然单击提交按钮。在下面的控制器方法之一中,即使用户没有更改任何内容,save() 方法是否会执行对数据库的查询并更新字段?
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(…)
期间究竟发生了什么取决于底层持久化技术。基本上有两类实现:
主动管理实体的实现。例如 JPA 和 Neo4j。这些实现跟踪从商店返回的实体,因此能够首先检测到变化。你为此付出了额外的复杂性,因为实体通常以某种方式进行检测,当然变化检测也需要时间,即使它最终没有检测到任何变化。但从好的方面来看,如果需要,只会触发更新。
不主动管理实体的实现。例如JDBC和MongoDB.这些实现不跟踪从数据存储加载的实体,因此不检测它们。这也意味着无法检测更改,因为所有实现看到的都是没有任何进一步上下文的实体实例。
在您的具体示例中,MongoDB 实现仍会发布更新,而如果请求参数不包含不同的值,JPA 将根本不会发布更新。
在编辑表单时,用户有时可能不更改表单而仍然单击提交按钮。在下面的控制器方法之一中,即使用户没有更改任何内容,save() 方法是否会执行对数据库的查询并更新字段?
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(…)
期间究竟发生了什么取决于底层持久化技术。基本上有两类实现:
主动管理实体的实现。例如 JPA 和 Neo4j。这些实现跟踪从商店返回的实体,因此能够首先检测到变化。你为此付出了额外的复杂性,因为实体通常以某种方式进行检测,当然变化检测也需要时间,即使它最终没有检测到任何变化。但从好的方面来看,如果需要,只会触发更新。
不主动管理实体的实现。例如JDBC和MongoDB.这些实现不跟踪从数据存储加载的实体,因此不检测它们。这也意味着无法检测更改,因为所有实现看到的都是没有任何进一步上下文的实体实例。
在您的具体示例中,MongoDB 实现仍会发布更新,而如果请求参数不包含不同的值,JPA 将根本不会发布更新。