如果实体没有变化,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(…) 期间究竟发生了什么取决于底层持久化技术。基本上有两类实现:

  1. 主动管理实体的实现。例如 JPA 和 Neo4j。这些实现跟踪从商店返回的实体,因此能够首先检测到变化。你为此付出了额外的复杂性,因为实体通常以某种方式进行检测,当然变化检测也需要时间,即使它最终没有检测到任何变化。但从好的方面来看,如果需要,只会触发更新。

  2. 主动管理实体的实现。例如JDBC和MongoDB.这些实现不跟踪从数据存储加载的实体,因此不检测它们。这也意味着无法检测更改,因为所有实现看到的都是没有任何进一步上下文的实体实例。

在您的具体示例中,MongoDB 实现仍会发布更新,而如果请求参数不包含不同的值,JPA 将根本不会发布更新。